home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / twu1.zip / TWU1UNA.PAS < prev    next >
Pascal/Delphi Source File  |  1991-06-05  |  66KB  |  1,732 lines

  1. UNIT TWU1UNA;
  2. {$O+}
  3. (*****************)
  4. (**) INTERFACE (**)    Uses TWU1EQU;
  5. (*****************)
  6.  
  7. TYPE
  8.     OprStr = String[32];
  9.  
  10.     CpuGate = (C086,C186,C286,C386);
  11.  
  12.     ObjArg =
  13.         RECORD
  14.                         CBase: LongInt; { INPUT: Base Offset of Code Group }
  15.             Obj  : Word;    { INPUT: Offset of text to Examine }
  16.             Lim  : Word;    { INPUT: Max Bytes to Examine }
  17.             TCpu : CpuGate; { INPUT: Cpu code to handle }
  18.             Locn : Word;    { RETURN: Code Offset }
  19.             Code : OprStr;    { RETURN: Object Text in ASCII }
  20.             Mnem : OprStr;    { RETURN: Mnemonic(s) in ASCII }
  21.             Opr1 : OprStr;    { RETURN: ASCII Operand 1 }
  22.             Opr2 : OprStr;    { RETURN: ASCII Operand 2 }
  23.             Opr3 : OprStr;    { RETURN: ASCII Operand 3 }
  24.         END;
  25.  
  26. CONST    SegDBit : Boolean = FALSE; { Assume 16-Bit Addressing }
  27.  
  28. PROCEDURE UnAssemble(U : Pointer; VAR P : ObjArg);
  29.  
  30. (**********************)
  31. (**) IMPLEMENTATION (**)
  32. (**********************)
  33.  
  34. TYPE    { Types Below Used For Quick Classification of Op-Codes }
  35.  
  36.    Gating =
  37.     (G_RM1,     G_RM2,     G_RM3,     G_RM4,     G_RM5,
  38.      G_RM6,     G_RM7,     G_RM8,     G_RM9,        { modR/M Has op bits }
  39.      G_Hit,    { defined operation }
  40.          G_AAM,    { 2-byte AAM/AAD op }
  41.      G_0Fx,    { 0F-type operation }
  42.      G_387,    { escapes to 80387  }
  43.      G_Pfx,    { prefix  operation }
  44.      G_ooo);   { invalid operation }
  45.  
  46.    Gate_2 =        { 2nd-level gates for G_0Fx Operations }
  47.     (Row_0,
  48.      Row_2,
  49.      Row_8,
  50.      Row_9,
  51.      Row_A,
  52.      Row_B,
  53.      Row_X);   { invalid otherwise }
  54.  
  55.    TAdr = (Adr16,Adr32);    {16-bit or 32-bit Addressing}
  56.    WBitStatus = (W0,W1);    {W1 = W-bit ON, else W0}
  57.    REGString = String[3];
  58.    TagRec =
  59.     RECORD
  60.         A : Char;    {tells type of operand}
  61.         V : Byte        {gives width/value etc}
  62.     END;
  63.    TagGrp = ARRAY[1..3] OF TagRec;
  64.  
  65.    CpuVec =
  66.     RECORD
  67.         F,    {Bit Flags for Processing Options}
  68.             {1xxx xxxx = alternate Mnemonic at M+1  }
  69.             {x1xx xxxx = 32-bit if OpSiz Prefix     }
  70.             {xx1x xxxx = 16-bit normally            }
  71.             {xxx1 xxxx = sign-extend immediates     }
  72.             {xxxx 1xxx = Op has modR/M field        }
  73.             {---- -ccc = Cpu Required for Op    }
  74.  
  75.         M,    {8086  Mnemonic Index}
  76.         T    {Operand Format Index}
  77.                             : Byte
  78.     END;
  79.  
  80.    MpuVec =                    {.CP27}
  81.     RECORD
  82.         F,    { Flag Bits (see below)
  83.             0000 0000 = INVALID operation
  84.             0010 xxxx = Entire modR/M byte defines op-code
  85.             0001 xxxx = modR/M REG field defines op-code
  86.  
  87.             xxxx 0000 = no explicit operand(s) coded
  88.             xxxx 0001 = operand is "AX"
  89.             xxxx 0010 = operand is "Bcd80"
  90.             xxxx 0011 = operand is "Ea" (no size implied)
  91.             xxxx 0100 = operand is "Ew" (16-bit word)
  92.             xxxx 0101 = operand is "Int16"
  93.             xxxx 0110 = operand is "Int32"
  94.             xxxx 0111 = operand is "Int64"
  95.             xxxx 1000 = operand is "Real32"
  96.             xxxx 1001 = operand is "Real64"
  97.             xxxx 1010 = operand is "Real80"
  98.             xxxx 1011 = operand is "ST(i)"
  99.             xxxx 1100 = operand is "ST(i),ST"
  100.             xxxx 1101 = operand is "ST,ST(i)"
  101.             xxxx 1110 = reserved
  102.             xxxx 1111 = reserved
  103.             }
  104.         M    { index to mnemonic table }
  105.                 : Byte
  106.     END;
  107.  
  108.  
  109.    TMrm =
  110.     RECORD
  111.         D,       { Size in Bytes of Displacement Field}
  112.         SIB,     { 1 -> SIB field present, else no SIB}
  113.         rS,      { index to Segment Register String   }
  114.         rB,      { index to  Base   Register String   }
  115.         rX       { index to  Index  Register String   }
  116.             : Byte
  117.     END;
  118.  
  119.    SibRec =
  120.     RECORD
  121.         D,      { displacement width (bytes) }
  122.         rS,     { default segment register   }
  123.         rB      { default base register      }
  124.             : Byte
  125.     END;
  126.  
  127.    sxRec =
  128.     RECORD
  129.         rX,  { to index reg name }
  130.         sF   { multiplier; if 0, ss must be too or illegal}
  131.             : Byte
  132.     END;
  133.  
  134. CONST                                                         {.CP09}
  135.     { ------------------------------------------- }
  136.     { Named Values for Bit Flags in RECORD CpuVec }
  137.     { ------------------------------------------- }
  138.  
  139.     _386Xtnsn = $80; _32BitMax = $40; _16BitMin = $20;
  140.     _SignXtnd = $10; _MODrmFld = $08;
  141.  
  142.     O0 = Ord(C086); O1 = Ord(C186); O2 = Ord(C286); O3 = Ord(C386);
  143.  
  144.   Mnem386 : ARRAY[1..170] OF STRING[6] = (            {.CP31}
  145.  
  146.     {001}  'AAA',    'AAD',    'AAM',    'AAS',    'ADC',    'ADD',
  147.     {007}  'AND',     'ARPL',   'BOUND',  'BSF',    'BSR',     'BT',
  148.     {013}  'BTC',     'BTR',       'BTS',    'CALL',   'CBW',     'CWDE',
  149.     {019}  'CLC',     'CLD',       'CLI',    'CLTS',   'CMC',     'CMP',
  150.     {025}  'CMPSB',     'CMPSW',  'CMPSD',  'CWD',    'CDQ',     'DAA',
  151.     {031}  'DAS',     'DEC',       'DIV',    'ENTER',  'HLT',     'IDIV',
  152.     {037}  'IMUL',     'IN',       'INC',    'INSB',   'INSW',     'INSD',
  153.     {043}  'INT',     'INTO',   'IRET',   'JB',     'JBE',     'JCXZ',
  154.     {049}  'JECXZ',     'JLE',       'JMP',    'JNB',    'JNBE',     'JNL',
  155.     {055}  'JNLE',     'JNO',       'JNP',    'JNS',    'JNZ',     'JO',
  156.     {061}  'JP',     'JS',       'JZ',     'LAHF',   'LAR',     'LDS',
  157.     {067}  'LEA',     'LEAVE',  'LES',    'LFS',    'LGDT',     'LGS',
  158.     {073}  'LIDT',     'LLDT',   'LMSW',   'LOCK',   'LODSB',     'LODSW',
  159.     {079}  'LODSD',     'LOOP',   'LOOPE',  'LOOPNE', 'LSL',     'LSS',
  160.     {085}  'LTR',     'MOV',       'MOVSB',  'MOVSW',  'MOVSD',     'MOVSX',
  161.     {091}  'MOVZX',     'MUL',       'NEG',    'NOP',    'NOT',     'OR',
  162.     {097}  'OUT',     'OUTSB',  'OUTSW',  'OUTSD',  'POP',     'POPA',
  163.     {103}  'POPAD',     'POPF',   'POPFD',  'PUSH',   'PUSHA',     'PUSHAD',
  164.     {109}  'PUSHF',     'PUSHFD', 'RCL',    'RCR',    'REP',     'REPNE',
  165.     {115}  'RET',     'RETF',   'ROL',    'ROR',    'SAHF',     'SAR',
  166.     {121}  'SBB',     'SCASB',  'SCASW',  'SCASD',  'SEGCS',     'SEGDS',
  167.     {127}  'SEGES',     'SEGFS',  'SEGGS',  'SEGSS',  'SETB',     'SETBE',
  168.     {133}  'SETL',     'SETLE',  'SETNB',  'SETNBE', 'SETNL',     'SETNLE',
  169.     {139}  'SETNO',     'SETNP',  'SETNS',  'SETNZ',  'SETO',     'SETP',
  170.     {145}  'SETS',     'SETZ',   'SGDT',   'SHL',    'SHLD',     'SHR',
  171.     {151}  'SHRD',   'SIDT',   'SLDT',   'SMSW',   'STC',     'STD',
  172.     {157}  'STI',    'STOSB',  'STOSW',  'STOSD',  'STR',     'SUB',
  173.     {163}  'TEST',     'VERR',   'VERW',   'WAIT',   'XCHG',     'XLATB',
  174.     {169}  'XOR',     'JL');
  175.  
  176.  
  177.    Mnem387 : ARRAY[1..76] OF STRING[7] = (            {.CP15}
  178.  
  179.     {01}  'F2XM1',  'FABS',   'FADD',   'FADDP',   'FBLD',   'FBSTP',
  180.     {07}  'FCHS',   'FCLEX',  'FCOM',   'FCOMP',   'FCOMPP', 'FCOS',
  181.     {13}  'FDECSTP','FDISI',  'FDIV',   'FDIVP',   'FDIVR',  'FDIVRP',
  182.     {19}  'FENI',   'FFREE',  'FIADD',  'FICOM',   'FICOMP', 'FIDIV',
  183.     {25}  'FIDIVR', 'FILD',   'FIMUL',  'FINCSTP', 'FINIT',  'FIST',
  184.     {31}  'FISTP',  'FISUB',  'FISUBR', 'FLD',     'FLD1',   'FLDCW',
  185.     {37}  'FLDENV', 'FLDG2',  'FLDL2E', 'FLDL2T',  'FLDN2',  'FLDPI',
  186.     {43}  'FLDZ',   'FMUL',   'FMULP',  'FNOP',    'FPATAN', 'FPREM',
  187.     {49}  'FPREM1', 'FPTAN',  'FRNDINT','FRSTOR',  'FSAVE',  'FSCALE',
  188.     {55}  'FSETPM', 'FSIN',   'FSINCOS','FSQRT',   'FST',    'FSTCW',
  189.     {61}  'FSTENV', 'FSTP',   'FSTSW',  'FSUB',    'FSUBP',  'FSUBR',
  190.     {67}  'FSUBRP', 'FTST',   'FUCOM',  'FUCOMP',  'FUCOMPP','FXAM',
  191.     {73}  'FXCH',   'FXTRACT','FYL2X',  'FYL2XP1');
  192.  
  193.  
  194.     { -------------------------------------------------- }    {.CP38}
  195.     { 386 Operations With One-Byte Op-Codes Handled Next }
  196.     { -------------------------------------------------- }
  197.  
  198.   GateLvl1 : ARRAY[0..255] of Gating = (
  199.  
  200.     {00}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  201.     {08}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_0Fx,
  202.     {10}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  203.     {18}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  204.     {20}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Pfx, G_Hit,
  205.     {28}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Pfx, G_Hit,
  206.     {30}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Pfx, G_Hit,
  207.     {38}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Pfx, G_Hit,
  208.     {40}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  209.     {48}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  210.     {50}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  211.     {58}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  212.     {60}    G_Hit, G_Hit, G_Hit, G_Hit, G_Pfx, G_Pfx, G_Pfx, G_Pfx,
  213.     {68}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  214.     {70}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  215.     {78}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  216.     {80}    G_RM1, G_RM1, G_ooo, G_RM1, G_Hit, G_Hit, G_Hit, G_Hit,
  217.     {88}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  218.     {90}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  219.     {98}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  220.     {A0}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  221.     {A8}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  222.     {B0}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  223.     {B8}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  224.     {C0}    G_RM2, G_RM2, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  225.     {C8}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  226.     {D0}    G_RM2, G_RM2, G_RM2, G_RM2, G_AAM, G_AAM, G_ooo, G_Hit,
  227.     {D8}    G_387, G_387, G_387, G_387, G_387, G_387, G_387, G_387,
  228.     {E0}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  229.     {E8}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit,
  230.     {F0}    G_Pfx, G_ooo, G_Pfx, G_Pfx, G_Hit, G_Hit, G_RM3, G_RM9,
  231.     {F8}    G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_RM4, G_RM5);
  232.  
  233.     { -------------------------------------------------- }    {.CP32}
  234.     { 386 Operations With Two-Byte Op-Codes Handled Next }
  235.     { -------------------------------------------------- }
  236.  
  237.    GateLvX2 : ARRAY[0..15] OF Gate_2 = (
  238.  
  239.     {0} Row_0, Row_X, Row_2, Row_X, Row_X, Row_X, Row_X, Row_X,
  240.     {8} Row_8, Row_9, Row_A, Row_B, Row_X, Row_X, Row_X, Row_X);
  241.  
  242.    GateLvl2 :    ARRAY[Row_0..Row_X] OF
  243.         ARRAY[0..15] OF Gating = (
  244.  
  245.     {[_0,0]} (G_RM6,G_RM7,G_Hit,G_Hit,G_ooo,G_ooo,G_Hit,G_ooo,
  246.     {[_0,8]}  G_ooo,G_ooo,G_ooo,G_ooo,G_ooo,G_ooo,G_ooo,G_ooo),
  247.  
  248.     {[_2,0]} (G_Hit,G_Hit,G_Hit,G_Hit,G_Hit,G_ooo,G_Hit,G_ooo,
  249.     {[_2,8]}  G_ooo,G_ooo,G_ooo,G_ooo,G_ooo,G_ooo,G_ooo,G_ooo),
  250.  
  251.     {[_8,0]} (G_Hit,G_Hit,G_Hit,G_Hit,G_Hit,G_Hit,G_Hit,G_Hit,
  252.     {[_8,8]}  G_Hit,G_Hit,G_Hit,G_Hit,G_Hit,G_Hit,G_Hit,G_Hit),
  253.  
  254.     {[_9,0]} (G_Hit,G_Hit,G_Hit,G_Hit,G_Hit,G_Hit,G_Hit,G_Hit,
  255.     {[_9,8]}  G_Hit,G_Hit,G_Hit,G_Hit,G_Hit,G_Hit,G_Hit,G_Hit),
  256.  
  257.     {[_A,0]} (G_Hit,G_Hit,G_ooo,G_Hit,G_Hit,G_Hit,G_ooo,G_ooo,
  258.     {[_A,8]}  G_Hit,G_Hit,G_ooo,G_Hit,G_Hit,G_Hit,G_ooo,G_Hit),
  259.  
  260.     {[_B,0]} (G_ooo,G_ooo,G_Hit,G_Hit,G_Hit,G_Hit,G_Hit,G_Hit,
  261.     {[_B,8]}  G_ooo,G_ooo,G_RM8,G_Hit,G_Hit,G_Hit,G_Hit,G_Hit),
  262.  
  263.     {[_X,0]} (G_ooo,G_ooo,G_ooo,G_ooo,G_ooo,G_ooo,G_ooo,G_ooo,
  264.     {[_X,8]}  G_ooo,G_ooo,G_ooo,G_ooo,G_ooo,G_ooo,G_ooo,G_ooo));
  265.  
  266.  
  267.     { -------------------------------------------------- }    {.CP16}
  268.     { 386 Operations Resolved in modR/M 543 Handled Next }
  269.     { -------------------------------------------------- }
  270.  
  271.    GateLvl3 :    ARRAY[G_RM1..G_RM9] OF
  272.         ARRAY[0..7] OF Gating = (
  273.  
  274.     {[_1,0]}  (G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit),
  275.     {[_2,0]}  (G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_ooo, G_Hit),
  276.     {[_3,0]}  (G_Hit, G_ooo, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit),
  277.     {[_4,0]}  (G_Hit, G_Hit, G_ooo, G_ooo, G_ooo, G_ooo, G_ooo, G_ooo),
  278.     {[_5,0]}  (G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_ooo),
  279.     {[_6,0]}  (G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_ooo, G_ooo),
  280.     {[_7,0]}  (G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_ooo, G_Hit, G_ooo),
  281.     {[_8,0]}  (G_ooo, G_ooo, G_ooo, G_ooo, G_Hit, G_Hit, G_Hit, G_Hit),
  282.     {[_9,0]}  (G_Hit, G_ooo, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit, G_Hit));
  283.  
  284.  
  285.     { ------------------------------------------------- }    {.CP08}
  286.     { Operand Format Driver Vector - 80386 Instructions }
  287.     { ------------------------------------------------- }
  288.  
  289.    OpType386 :    ARRAY[0..96] OF TagGrp = (
  290.  
  291.     {00} ((A: ' '; V: 30), (A: ' '; V: 30), (A: ' '; V: 30)),
  292.     {01} ((A: ' '; V: 30), (A: 'I'; V: 34), (A: ' '; V: 30)),
  293.     {02} ((A: ' '; V: 30), (A: 'I'; V: 38), (A: ' '; V: 30)),
  294.     {03} ((A: 'A'; V: 36), (A: ' '; V: 30), (A: ' '; V: 30)),
  295.     {04} ((A: 'C'; V: 35), (A: 'R'; V: 35), (A: ' '; V: 30)),
  296.     {05} ((A: 'D'; V: 35), (A: 'R'; V: 35), (A: ' '; V: 30)),
  297.     {06} ((A: 'E'; V: 34), (A: ' '; V: 30), (A: ' '; V: 30)),
  298.     {07} ((A: 'E'; V: 34), (A: 'G'; V: 34), (A: ' '; V: 30)),
  299.     {08} ((A: 'E'; V: 34), (A: 'I'; V: 34), (A: ' '; V: 30)),
  300.     {09} ((A: 'E'; V: 34), (A: 'r'; V: 31), (A: ' '; V: 30)),
  301.     {10} ((A: 'E'; V: 34), (A: 'r'; V: 01), (A: ' '; V: 30)),
  302.     {11} ((A: 'E'; V: 36), (A: ' '; V: 30), (A: ' '; V: 30)),
  303.     {12} ((A: 'E'; V: 38), (A: ' '; V: 30), (A: ' '; V: 30)),
  304.     {13} ((A: 'E'; V: 38), (A: 'G'; V: 38), (A: ' '; V: 30)),
  305.     {14} ((A: 'E'; V: 38), (A: 'G'; V: 38), (A: 'I'; V: 34)),
  306.     {15} ((A: 'E'; V: 38), (A: 'G'; V: 38), (A: 'r'; V: 01)),
  307.     {16} ((A: 'E'; V: 38), (A: 'I'; V: 34), (A: ' '; V: 30)),
  308.     {17} ((A: 'E'; V: 38), (A: 'I'; V: 38), (A: ' '; V: 30)),
  309.     {18} ((A: 'E'; V: 38), (A: 'r'; V: 31), (A: ' '; V: 30)),
  310.     {19} ((A: 'E'; V: 38), (A: 'r'; V: 01), (A: ' '; V: 30)),
  311.     {20} ((A: 'E'; V: 39), (A: ' '; V: 30), (A: ' '; V: 30)),
  312.     {21} ((A: 'E'; V: 39), (A: 'G'; V: 39), (A: ' '; V: 30)),
  313.     {22} ((A: 'E'; V: 39), (A: 'S'; V: 39), (A: ' '; V: 30)),
  314.     {23} ((A: 'G'; V: 34), (A: 'E'; V: 34), (A: ' '; V: 30)),
  315.     {24} ((A: 'G'; V: 38), (A: 'E'; V: 34), (A: ' '; V: 30)),
  316.     {25} ((A: 'G'; V: 38), (A: 'E'; V: 38), (A: ' '; V: 30)),
  317.     {26} ((A: 'G'; V: 38), (A: 'E'; V: 38), (A: 'I'; V: 34)),
  318.     {27} ((A: 'G'; V: 38), (A: 'E'; V: 38), (A: 'I'; V: 38)),
  319.     {28} ((A: 'G'; V: 38), (A: 'E'; V: 39), (A: ' '; V: 30)),
  320.     {29} ((A: 'G'; V: 38), (A: 'I'; V: 38), (A: ' '; V: 30)),
  321.     {30} ((A: 'G'; V: 38), (A: 'M'; V: 30), (A: ' '; V: 30)),
  322.     {31} ((A: 'G'; V: 38), (A: 'M'; V: 33), (A: ' '; V: 30)),
  323.     {32} ((A: 'G'; V: 38), (A: 'M'; V: 36), (A: ' '; V: 30)),
  324.     {33} ((A: 'I'; V: 34), (A: ' '; V: 30), (A: ' '; V: 30)),
  325.     {34} ((A: 'I'; V: 34), (A: 'e'; V: 08), (A: ' '; V: 30)),
  326.     {35} ((A: 'I'; V: 34), (A: 'r'; V: 00), (A: ' '; V: 30)),
  327.     {36} ((A: 'I'; V: 38), (A: ' '; V: 30), (A: ' '; V: 30)),
  328.     {37} ((A: 'I'; V: 39), (A: ' '; V: 30), (A: ' '; V: 30)),
  329.     {38} ((A: 'I'; V: 39), (A: 'I'; V: 34), (A: ' '; V: 30)),
  330.     {39} ((A: 'J'; V: 34), (A: ' '; V: 30), (A: ' '; V: 30)),
  331.     {40} ((A: 'J'; V: 38), (A: ' '; V: 30), (A: ' '; V: 30)),
  332.     {41} ((A: 'M'; V: 37), (A: ' '; V: 30), (A: ' '; V: 30)),
  333.     {42} ((A: 'O'; V: 34), (A: 'r'; V: 00), (A: ' '; V: 30)),
  334.     {43} ((A: 'O'; V: 38), (A: 'e'; V: 08), (A: ' '; V: 30)),
  335.     {44} ((A: 'R'; V: 35), (A: 'C'; V: 35), (A: ' '; V: 30)),
  336.     {45} ((A: 'R'; V: 35), (A: 'D'; V: 35), (A: ' '; V: 30)),
  337.     {46} ((A: 'R'; V: 35), (A: 'T'; V: 35), (A: ' '; V: 30)),
  338.     {47} ((A: 'S'; V: 39), (A: 'E'; V: 39), (A: ' '; V: 30)),
  339.     {48} ((A: 'T'; V: 35), (A: 'R'; V: 35), (A: ' '; V: 30)),
  340.     {49} ((A: 'e'; V: 08), (A: ' '; V: 30), (A: ' '; V: 30)),
  341.     {50} ((A: 'e'; V: 08), (A: 'E'; V: 38), (A: ' '; V: 30)),
  342.     {51} ((A: 'e'; V: 08), (A: 'I'; V: 34), (A: ' '; V: 30)),
  343.     {52} ((A: 'e'; V: 08), (A: 'I'; V: 38), (A: ' '; V: 30)),
  344.     {53} ((A: 'e'; V: 08), (A: 'O'; V: 38), (A: ' '; V: 30)),
  345.     {54} ((A: 'e'; V: 08), (A: 'e'; V: 13), (A: ' '; V: 30)),
  346.     {55} ((A: 'e'; V: 08), (A: 'e'; V: 11), (A: ' '; V: 30)),
  347.     {56} ((A: 'e'; V: 08), (A: 'e'; V: 09), (A: ' '; V: 30)),
  348.     {57} ((A: 'e'; V: 08), (A: 'e'; V: 15), (A: ' '; V: 30)),
  349.     {58} ((A: 'e'; V: 08), (A: 'e'; V: 10), (A: ' '; V: 30)),
  350.     {59} ((A: 'e'; V: 08), (A: 'e'; V: 14), (A: ' '; V: 30)),
  351.     {60} ((A: 'e'; V: 08), (A: 'e'; V: 12), (A: ' '; V: 30)),
  352.     {61} ((A: 'e'; V: 08), (A: 'r'; V: 10), (A: ' '; V: 30)),
  353.     {62} ((A: 'e'; V: 13), (A: ' '; V: 30), (A: ' '; V: 30)),
  354.     {63} ((A: 'e'; V: 13), (A: 'I'; V: 38), (A: ' '; V: 30)),
  355.     {64} ((A: 'e'; V: 11), (A: ' '; V: 30), (A: ' '; V: 30)),
  356.     {65} ((A: 'e'; V: 11), (A: 'I'; V: 38), (A: ' '; V: 30)),
  357.     {66} ((A: 'e'; V: 09), (A: ' '; V: 30), (A: ' '; V: 30)),
  358.     {67} ((A: 'e'; V: 09), (A: 'I'; V: 38), (A: ' '; V: 30)),
  359.     {68} ((A: 'e'; V: 15), (A: ' '; V: 30), (A: ' '; V: 30)),
  360.     {69} ((A: 'e'; V: 15), (A: 'I'; V: 38), (A: ' '; V: 30)),
  361.     {70} ((A: 'e'; V: 10), (A: ' '; V: 30), (A: ' '; V: 30)),
  362.     {71} ((A: 'e'; V: 10), (A: 'I'; V: 38), (A: ' '; V: 30)),
  363.     {72} ((A: 'e'; V: 14), (A: ' '; V: 30), (A: ' '; V: 30)),
  364.     {73} ((A: 'e'; V: 14), (A: 'I'; V: 38), (A: ' '; V: 30)),
  365.     {74} ((A: 'e'; V: 12), (A: ' '; V: 30), (A: ' '; V: 30)),
  366.     {75} ((A: 'e'; V: 12), (A: 'I'; V: 38), (A: ' '; V: 30)),
  367.     {76} ((A: 'r'; V: 32), (A: ' '; V: 30), (A: ' '; V: 30)),
  368.     {77} ((A: 'r'; V: 04), (A: 'I'; V: 34), (A: ' '; V: 30)),
  369.     {78} ((A: 'r'; V: 00), (A: 'E'; V: 34), (A: ' '; V: 30)),
  370.     {79} ((A: 'r'; V: 00), (A: 'I'; V: 34), (A: ' '; V: 30)),
  371.     {80} ((A: 'r'; V: 00), (A: 'O'; V: 34), (A: ' '; V: 30)),
  372.     {81} ((A: 'r'; V: 00), (A: 'r'; V: 10), (A: ' '; V: 30)),
  373.     {82} ((A: 'r'; V: 07), (A: 'I'; V: 34), (A: ' '; V: 30)),
  374.     {83} ((A: 'r'; V: 03), (A: 'I'; V: 34), (A: ' '; V: 30)),
  375.     {84} ((A: 'r'; V: 05), (A: 'I'; V: 34), (A: ' '; V: 30)),
  376.     {85} ((A: 'r'; V: 01), (A: 'I'; V: 34), (A: ' '; V: 30)),
  377.     {86} ((A: 'r'; V: 25), (A: ' '; V: 30), (A: ' '; V: 30)),
  378.     {87} ((A: 'r'; V: 06), (A: 'I'; V: 34), (A: ' '; V: 30)),
  379.     {88} ((A: 'r'; V: 02), (A: 'I'; V: 34), (A: ' '; V: 30)),
  380.     {89} ((A: 'r'; V: 27), (A: ' '; V: 30), (A: ' '; V: 30)),
  381.     {90} ((A: 'r'; V: 10), (A: 'e'; V: 08), (A: ' '; V: 30)),
  382.     {91} ((A: 'r'; V: 10), (A: 'r'; V: 00), (A: ' '; V: 30)),
  383.     {92} ((A: 'r'; V: 24), (A: ' '; V: 30), (A: ' '; V: 30)),
  384.     {93} ((A: 'r'; V: 28), (A: ' '; V: 30), (A: ' '; V: 30)),
  385.     {94} ((A: 'r'; V: 29), (A: ' '; V: 30), (A: ' '; V: 30)),
  386.     {95} ((A: 'r'; V: 26), (A: ' '; V: 30), (A: ' '; V: 30)),
  387.     {96} ((A: 'E'; V: 33), (A: ' '; V: 30), (A: ' '; V: 30)));
  388.  
  389.  
  390.    ActLvl1 : ARRAY[$00..$FF] OF CpuVec = (            {.CP04}
  391.  
  392.     ({00} F:$08+O0; M:006; T:07),    ({01} F:$68+O0; M:006; T:13),
  393.     ({02} F:$08+O0; M:006; T:23),    ({03} F:$68+O0; M:006; T:25),
  394.     ({04} F:$00+O0; M:006; T:79),    ({05} F:$60+O0; M:006; T:52),
  395.     ({06} F:$20+O0; M:106; T:92),    ({07} F:$00+O0; M:101; T:92),
  396.     ({08} F:$08+O0; M:096; T:07),    ({09} F:$68+O0; M:096; T:13),
  397.     ({0A} F:$08+O0; M:096; T:23),    ({0B} F:$68+O0; M:096; T:25),
  398.     ({0C} F:$00+O0; M:096; T:79),    ({0D} F:$60+O0; M:096; T:52),
  399.     ({0E} F:$20+O0; M:106; T:86),    ({0F} F:$00+O0; M:000; T:00),
  400.     ({10} F:$08+O0; M:005; T:07),    ({11} F:$68+O0; M:005; T:13),
  401.     ({12} F:$08+O0; M:005; T:23),    ({13} F:$68+O0; M:005; T:25),
  402.     ({14} F:$00+O0; M:005; T:79),    ({15} F:$60+O0; M:005; T:52),
  403.     ({16} F:$20+O0; M:106; T:95),    ({17} F:$00+O0; M:101; T:95),
  404.     ({18} F:$08+O0; M:121; T:07),    ({19} F:$68+O0; M:121; T:13),
  405.     ({1A} F:$08+O0; M:121; T:23),    ({1B} F:$68+O0; M:121; T:25),
  406.     ({1C} F:$00+O0; M:121; T:79),    ({1D} F:$60+O0; M:121; T:52),
  407.     ({1E} F:$20+O0; M:106; T:89),    ({1F} F:$00+O0; M:101; T:89),
  408.     ({20} F:$08+O0; M:007; T:07),    ({21} F:$68+O0; M:007; T:13),
  409.     ({22} F:$08+O0; M:007; T:23),    ({23} F:$68+O0; M:007; T:25),
  410.     ({24} F:$00+O0; M:007; T:79),    ({25} F:$60+O0; M:007; T:52),
  411.     ({26} F:$00+O0; M:127; T:00),    ({27} F:$00+O0; M:030; T:00),
  412.     ({28} F:$08+O0; M:162; T:07),    ({29} F:$68+O0; M:162; T:13),
  413.     ({2A} F:$08+O0; M:162; T:23),    ({2B} F:$68+O0; M:162; T:25),
  414.     ({2C} F:$00+O0; M:162; T:79),    ({2D} F:$60+O0; M:162; T:52),
  415.     ({2E} F:$00+O0; M:125; T:00),    ({2F} F:$00+O0; M:031; T:00),
  416.     ({30} F:$08+O0; M:169; T:07),    ({31} F:$68+O0; M:169; T:13),
  417.     ({32} F:$08+O0; M:169; T:23),    ({33} F:$48+O0; M:169; T:25),
  418.     ({34} F:$00+O0; M:169; T:79),    ({35} F:$60+O0; M:169; T:52),
  419.     ({36} F:$00+O0; M:130; T:00),    ({37} F:$00+O0; M:001; T:00),
  420.     ({38} F:$08+O0; M:024; T:07),    ({39} F:$68+O0; M:024; T:13),
  421.     ({3A} F:$08+O0; M:024; T:23),    ({3B} F:$68+O0; M:024; T:25),
  422.     ({3C} F:$00+O0; M:024; T:79),    ({3D} F:$60+O0; M:024; T:52),
  423.     ({3E} F:$00+O0; M:126; T:00),    ({3F} F:$00+O0; M:004; T:00),
  424.     ({40} F:$60+O0; M:039; T:49),    ({41} F:$60+O0; M:039; T:66),
  425.     ({42} F:$60+O0; M:039; T:70),    ({43} F:$60+O0; M:039; T:64),
  426.     ({44} F:$60+O0; M:039; T:74),    ({45} F:$60+O0; M:039; T:62),
  427.     ({46} F:$60+O0; M:039; T:72),    ({47} F:$60+O0; M:039; T:68),
  428.     ({48} F:$60+O0; M:032; T:49),    ({49} F:$60+O0; M:032; T:66),
  429.     ({4A} F:$60+O0; M:032; T:70),    ({4B} F:$60+O0; M:032; T:64),
  430.     ({4C} F:$60+O0; M:032; T:74),    ({4D} F:$60+O0; M:032; T:62),
  431.     ({4E} F:$60+O0; M:032; T:72),    ({4F} F:$60+O0; M:032; T:68),
  432.     ({50} F:$60+O0; M:106; T:49),    ({51} F:$60+O0; M:106; T:66),
  433.     ({52} F:$60+O0; M:106; T:70),    ({53} F:$60+O0; M:106; T:64),
  434.     ({54} F:$60+O0; M:106; T:74),    ({55} F:$60+O0; M:106; T:62),
  435.     ({56} F:$60+O0; M:106; T:72),    ({57} F:$60+O0; M:106; T:68),
  436.     ({58} F:$60+O0; M:101; T:49),    ({59} F:$60+O0; M:101; T:66),
  437.     ({5A} F:$60+O0; M:101; T:70),    ({5B} F:$60+O0; M:101; T:64),
  438.     ({5C} F:$60+O0; M:101; T:74),    ({5D} F:$60+O0; M:101; T:62),
  439.     ({5E} F:$60+O0; M:101; T:72),    ({5F} F:$60+O0; M:101; T:68),
  440.     ({60} F:$E0+O1; M:107; T:00),    ({61} F:$E0+O1; M:102; T:00),
  441.     ({62} F:$68+O1; M:009; T:31),    ({63} F:$08+O2; M:008; T:21),
  442.     ({64} F:$00+O3; M:128; T:00),    ({65} F:$00+O3; M:129; T:00),
  443.     ({66} F:$00+O3; M:000; T:00),    ({67} F:$00+O3; M:000; T:00),
  444.     ({68} F:$60+O1; M:106; T:36),    ({69} F:$68+O1; M:037; T:27),
  445.     ({6A} F:$00+O1; M:106; T:33),    ({6B} F:$78+O1; M:037; T:26),
  446.     ({6C} F:$00+O1; M:040; T:00),    ({6D} F:$C0+O1; M:041; T:00),
  447.     ({6E} F:$00+O1; M:098; T:00),    ({6F} F:$E0+O1; M:099; T:00),
  448.     ({70} F:$00+O0; M:060; T:39),    ({71} F:$00+O0; M:056; T:39),
  449.     ({72} F:$00+O0; M:046; T:39),    ({73} F:$00+O0; M:052; T:39),
  450.     ({74} F:$00+O0; M:063; T:39),    ({75} F:$00+O0; M:059; T:39),
  451.     ({76} F:$00+O0; M:047; T:39),    ({77} F:$00+O0; M:053; T:39),
  452.     ({78} F:$00+O0; M:062; T:39),    ({79} F:$00+O0; M:058; T:39),
  453.     ({7A} F:$00+O0; M:061; T:39),    ({7B} F:$00+O0; M:057; T:39),
  454.     ({7C} F:$00+O0; M:170; T:39),    ({7D} F:$00+O0; M:054; T:39),
  455.     ({7E} F:$00+O0; M:050; T:39),    ({7F} F:$00+O0; M:055; T:39),
  456.     ({80} F:$00+O0; M:000; T:08),    ({81} F:$60+O0; M:000; T:17),
  457.     ({82} F:$00+O0; M:000; T:00),    ({83} F:$70+O0; M:000; T:16),
  458.     ({84} F:$08+O0; M:163; T:07),    ({85} F:$68+O0; M:163; T:13),
  459.     ({86} F:$08+O0; M:167; T:07),    ({87} F:$68+O0; M:167; T:13),
  460.     ({88} F:$08+O0; M:086; T:07),    ({89} F:$68+O0; M:086; T:13),
  461.     ({8A} F:$08+O0; M:086; T:23),    ({8B} F:$68+O0; M:086; T:25),
  462.     ({8C} F:$28+O0; M:086; T:22),    ({8D} F:$68+O0; M:067; T:30),
  463.     ({8E} F:$28+O0; M:086; T:47),    ({8F} F:$68+O0; M:101; T:12),
  464.     ({90} F:$00+O0; M:094; T:00),    ({91} F:$60+O0; M:167; T:56),
  465.     ({92} F:$40+O0; M:167; T:58),    ({93} F:$60+O0; M:167; T:55),
  466.     ({94} F:$60+O0; M:167; T:60),    ({95} F:$60+O0; M:167; T:54),
  467.     ({96} F:$60+O0; M:167; T:59),    ({97} F:$60+O0; M:167; T:57),
  468.     ({98} F:$F0+O0; M:017; T:00),    ({99} F:$E0+O0; M:028; T:00),
  469.     ({9A} F:$00+O0; M:016; T:03),    ({9B} F:$00+O0; M:166; T:00),
  470.     ({9C} F:$E0+O0; M:109; T:00),    ({9D} F:$E0+O0; M:104; T:00),
  471.     ({9E} F:$00+O0; M:119; T:00),    ({9F} F:$00+O0; M:064; T:00),
  472.     ({A0} F:$00+O0; M:086; T:80),    ({A1} F:$60+O0; M:086; T:53),
  473.     ({A2} F:$00+O0; M:086; T:42),    ({A3} F:$60+O0; M:086; T:43),
  474.     ({A4} F:$00+O0; M:087; T:00),    ({A5} F:$E0+O0; M:088; T:00),
  475.     ({A6} F:$00+O0; M:025; T:00),    ({A7} F:$E0+O0; M:026; T:00),
  476.     ({A8} F:$00+O0; M:163; T:79),    ({A9} F:$60+O0; M:163; T:52),
  477.     ({AA} F:$00+O0; M:158; T:00),    ({AB} F:$E0+O0; M:159; T:00),
  478.     ({AC} F:$00+O0; M:077; T:00),    ({AD} F:$C0+O0; M:078; T:00),
  479.     ({AE} F:$00+O0; M:122; T:00),    ({AF} F:$E0+O0; M:123; T:00),
  480.     ({B0} F:$00+O0; M:086; T:79),    ({B1} F:$00+O0; M:086; T:85),
  481.     ({B2} F:$00+O0; M:086; T:88),    ({B3} F:$00+O0; M:086; T:83),
  482.     ({B4} F:$00+O0; M:086; T:77),    ({B5} F:$00+O0; M:086; T:84),
  483.     ({B6} F:$00+O0; M:086; T:87),    ({B7} F:$00+O0; M:086; T:82),
  484.     ({B8} F:$60+O0; M:086; T:52),    ({B9} F:$60+O0; M:086; T:67),
  485.     ({BA} F:$60+O0; M:086; T:71),    ({BB} F:$60+O0; M:086; T:65),
  486.     ({BC} F:$60+O0; M:086; T:75),    ({BD} F:$60+O0; M:086; T:63),
  487.     ({BE} F:$60+O0; M:086; T:73),    ({BF} F:$60+O0; M:086; T:69),
  488.     ({C0} F:$00+O1; M:000; T:08),    ({C1} F:$60+O1; M:000; T:16),
  489.     ({C2} F:$00+O0; M:115; T:37),    ({C3} F:$00+O0; M:115; T:00),
  490.     ({C4} F:$68+O0; M:069; T:32),    ({C5} F:$68+O0; M:066; T:32),
  491.     ({C6} F:$08+O0; M:086; T:08),    ({C7} F:$68+O0; M:086; T:17),
  492.     ({C8} F:$00+O1; M:034; T:38),    ({C9} F:$00+O1; M:068; T:00),
  493.     ({CA} F:$00+O0; M:116; T:37),    ({CB} F:$00+O0; M:116; T:00),
  494.     ({CC} F:$00+O0; M:043; T:76),    ({CD} F:$00+O0; M:043; T:33),
  495.     ({CE} F:$00+O0; M:044; T:00),    ({CF} F:$00+O0; M:045; T:00),
  496.     ({D0} F:$00+O0; M:000; T:09),    ({D1} F:$60+O0; M:000; T:18),
  497.     ({D2} F:$00+O0; M:000; T:10),    ({D3} F:$60+O0; M:000; T:19),
  498.     ({D4} F:$00+O0; M:003; T:00),    ({D5} F:$00+O0; M:002; T:00),
  499.     ({D6} F:$00+O0; M:000; T:00),    ({D7} F:$00+O0; M:168; T:00),
  500.     ({D8} F:$00+O0; M:000; T:00),    ({D9} F:$00+O0; M:000; T:00),
  501.     ({DA} F:$00+O0; M:000; T:00),    ({DB} F:$00+O0; M:000; T:00),
  502.     ({DC} F:$00+O0; M:000; T:00),    ({DD} F:$00+O0; M:000; T:00),
  503.     ({DE} F:$00+O0; M:000; T:00),    ({DF} F:$00+O0; M:000; T:00),
  504.     ({E0} F:$00+O0; M:082; T:39),    ({E1} F:$00+O0; M:081; T:39),
  505.     ({E2} F:$00+O0; M:080; T:39),    ({E3} F:$E0+O0; M:048; T:39),
  506.     ({E4} F:$00+O0; M:038; T:79),    ({E5} F:$60+O0; M:038; T:51),
  507.     ({E6} F:$00+O0; M:097; T:35),    ({E7} F:$60+O0; M:097; T:34),
  508.     ({E8} F:$60+O0; M:016; T:40),    ({E9} F:$40+O0; M:051; T:40),
  509.     ({EA} F:$40+O0; M:051; T:03),    ({EB} F:$00+O0; M:051; T:39),
  510.     ({EC} F:$00+O0; M:038; T:81),    ({ED} F:$60+O0; M:038; T:61),
  511.     ({EE} F:$00+O0; M:097; T:91),    ({EF} F:$60+O0; M:097; T:90),
  512.     ({F0} F:$00+O0; M:076; T:00),    ({F1} F:$00+O0; M:000; T:00),
  513.     ({F2} F:$00+O0; M:114; T:00),    ({F3} F:$00+O0; M:113; T:00),
  514.     ({F4} F:$00+O0; M:035; T:00),    ({F5} F:$00+O0; M:023; T:00),
  515.     ({F6} F:$00+O0; M:000; T:06),    ({F7} F:$00+O0; M:000; T:12),
  516.     ({F8} F:$00+O0; M:019; T:00),    ({F9} F:$00+O0; M:155; T:00),
  517.     ({FA} F:$00+O0; M:021; T:00),    ({FB} F:$00+O0; M:157; T:00),
  518.     ({FC} F:$00+O0; M:020; T:00),    ({FD} F:$00+O0; M:156; T:00),
  519.     ({FE} F:$00+O0; M:000; T:00),    ({FF} F:$00+O0; M:000; T:00));
  520.  
  521.  
  522. ActLvl2:    ARRAY[Row_0..Row_B]    OF          {2-byte Row Index}{.CP05}
  523.         ARRAY[$00..$0F]     OF CpuVec = ( {2-byte Col Index}
  524.  
  525.     {_0,0} ((F:$00+O0; M:000; T:00),    {_0,1} (F:$00+O0; M:000; T:00),
  526.     {_0,2}  (F:$48+O2; M:065; T:28),    {_0,3} (F:$68+O2; M:083; T:28),
  527.     {_0,4}  (F:$00+O0; M:000; T:00),    {_0,5} (F:$00+O0; M:000; T:00),
  528.     {_0,6}  (F:$00+O2; M:022; T:00),    {_0,7} (F:$00+O0; M:000; T:00),
  529.     {_0,8}  (F:$00+O0; M:000; T:00),    {_0,9} (F:$00+O0; M:000; T:00),
  530.     {_0,A}  (F:$00+O0; M:000; T:00),    {_0,B} (F:$00+O0; M:000; T:00),
  531.     {_0,C}  (F:$00+O0; M:000; T:00),    {_0,D} (F:$00+O0; M:000; T:00),
  532.     {_0,E}  (F:$00+O0; M:000; T:00),    {_0,F} (F:$00+O0; M:000; T:00)),
  533.     {_2,0} ((F:$08+O3; M:086; T:04),    {_2,1} (F:$08+O3; M:086; T:05),
  534.     {_2,2}  (F:$08+O3; M:086; T:44),    {_2,3} (F:$08+O3; M:086; T:45),
  535.     {_2,4}  (F:$08+O3; M:086; T:48),    {_2,5} (F:$00+O0; M:000; T:00),
  536.     {_2,6}  (F:$08+O3; M:086; T:46),    {_2,7} (F:$00+O0; M:000; T:00),
  537.     {_2,8}  (F:$00+O0; M:000; T:00),    {_2,9} (F:$00+O0; M:000; T:00),
  538.     {_2,A}  (F:$00+O0; M:000; T:00),    {_2,B} (F:$00+O0; M:000; T:00),
  539.     {_2,C}  (F:$00+O0; M:000; T:00),    {_2,D} (F:$00+O0; M:000; T:00),
  540.     {_2,E}  (F:$00+O0; M:000; T:00),    {_2,F} (F:$00+O0; M:000; T:00)),
  541.     {_8,0} ((F:$40+O3; M:060; T:40),    {_8,1} (F:$40+O3; M:056; T:40),
  542.     {_8,2}  (F:$40+O3; M:046; T:40),    {_8,3} (F:$40+O3; M:052; T:40),
  543.     {_8,4}  (F:$40+O3; M:063; T:40),    {_8,5} (F:$40+O3; M:059; T:40),
  544.     {_8,6}  (F:$40+O3; M:047; T:40),    {_8,7} (F:$40+O3; M:053; T:40),
  545.     {_8,8}  (F:$40+O3; M:062; T:40),    {_8,9} (F:$40+O3; M:058; T:40),
  546.     {_8,A}  (F:$40+O3; M:061; T:40),    {_8,B} (F:$40+O3; M:057; T:40),
  547.     {_8,C}  (F:$40+O3; M:170; T:40),    {_8,D} (F:$40+O3; M:054; T:40),
  548.     {_8,E}  (F:$40+O3; M:050; T:40),    {_8,F} (F:$40+O3; M:055; T:40)),
  549.     {_9,0} ((F:$08+O3; M:143; T:06),    {_9,1} (F:$08+O3; M:139; T:06),
  550.     {_9,2}  (F:$08+O3; M:131; T:06),    {_9,3} (F:$08+O3; M:135; T:06),
  551.     {_9,4}  (F:$08+O3; M:146; T:06),    {_9,5} (F:$08+O3; M:142; T:06),
  552.     {_9,6}  (F:$08+O3; M:132; T:06),    {_9,7} (F:$08+O3; M:136; T:06),
  553.     {_9,8}  (F:$08+O3; M:145; T:06),    {_9,9} (F:$08+O3; M:141; T:06),
  554.     {_9,A}  (F:$08+O3; M:144; T:06),    {_9,B} (F:$08+O3; M:140; T:06),
  555.     {_9,C}  (F:$08+O3; M:133; T:06),    {_9,D} (F:$08+O3; M:137; T:06),
  556.     {_9,E}  (F:$08+O3; M:134; T:06),    {_9,F} (F:$08+O3; M:138; T:06)),
  557.     {_A,0} ((F:$20+O3; M:106; T:93),    {_A,1} (F:$00+O3; M:101; T:93),
  558.     {_A,2}  (F:$00+O0; M:000; T:00),    {_A,3} (F:$68+O3; M:012; T:13),
  559.     {_A,4}  (F:$68+O3; M:149; T:14),    {_A,5} (F:$68+O3; M:149; T:15),
  560.     {_A,6}  (F:$00+O0; M:000; T:00),    {_A,7} (F:$00+O0; M:000; T:00),
  561.     {_A,8}  (F:$20+O3; M:106; T:94),    {_A,9} (F:$00+O3; M:101; T:94),
  562.     {_A,A}  (F:$00+O0; M:000; T:00),    {_A,B} (F:$68+O3; M:015; T:13),
  563.     {_A,C}  (F:$68+O3; M:151; T:14),    {_A,D} (F:$68+O3; M:151; T:15),
  564.     {_A,E}  (F:$00+O0; M:000; T:00),    {_A,F} (F:$68+O3; M:037; T:25)),
  565.     {_B,0} ((F:$00+O0; M:000; T:00),    {_B,1} (F:$00+O0; M:000; T:00),
  566.     {_B,2}  (F:$68+O3; M:084; T:32),    {_B,3} (F:$68+O3; M:014; T:13),
  567.     {_B,4}  (F:$68+O3; M:070; T:32),    {_B,5} (F:$68+O3; M:072; T:32),
  568.     {_B,6}  (F:$78+O3; M:091; T:24),    {_B,7} (F:$78+O3; M:091; T:28),
  569.     {_B,8}  (F:$00+O0; M:000; T:00),    {_B,9} (F:$00+O0; M:000; T:00),
  570.     {_B,A}  (F:$00+O0; M:000; T:00),    {_B,B} (F:$68+O3; M:013; T:13),
  571.     {_B,C}  (F:$68+O3; M:010; T:25),    {_B,D} (F:$68+O3; M:011; T:25),
  572.     {_B,E}  (F:$78+O3; M:090; T:24),    {_B,F} (F:$78+O3; M:090; T:28)));
  573.  
  574.  
  575.    ActLvl3 :    ARRAY[G_RM1..G_RM9]    OF          {modR/M Group Index}{.CP05}
  576.         ARRAY[$00..$07]     OF CpuVec = ( {modR/M Reg   Index}
  577.  
  578.     {G_RM1,0} ((F:$00+O0; M:006; T:00),    {G_RM1,1}  (F:$00+O0; M:096; T:00),
  579.     {G_RM1,2}  (F:$00+O0; M:005; T:00),    {G_RM1,3}  (F:$00+O0; M:121; T:00),
  580.     {G_RM1,4}  (F:$00+O0; M:007; T:00),    {G_RM1,5}  (F:$00+O0; M:162; T:00),
  581.     {G_RM1,6}  (F:$00+O0; M:169; T:00),    {G_RM1,7}  (F:$00+O0; M:024; T:00)),
  582.  
  583.     {G_RM2,0} ((F:$00+O0; M:117; T:00),    {G_RM2,1}  (F:$00+O0; M:118; T:00),
  584.     {G_RM2,2}  (F:$00+O0; M:111; T:00),    {G_RM2,3}  (F:$00+O0; M:112; T:00),
  585.     {G_RM2,4}  (F:$00+O0; M:148; T:00),    {G_RM2,5}  (F:$00+O0; M:150; T:00),
  586.     {G_RM2,6}  (F:$00+O0; M:000; T:00),    {G_RM2,7}  (F:$00+O0; M:120; T:00)),
  587.  
  588.     {G_RM3,0} ((F:$00+O0; M:163; T:01),    {G_RM3,1}  (F:$00+O0; M:000; T:00),
  589.     {G_RM3,2}  (F:$00+O0; M:095; T:00),    {G_RM3,3}  (F:$00+O0; M:093; T:00),
  590.     {G_RM3,4}  (F:$00+O0; M:092; T:78),    {G_RM3,5}  (F:$00+O0; M:037; T:00),
  591.     {G_RM3,6}  (F:$00+O0; M:033; T:00),    {G_RM3,7}  (F:$00+O0; M:036; T:00)),
  592.  
  593.     {G_RM4,0} ((F:$00+O0; M:039; T:06),    {G_RM4,1}  (F:$00+O0; M:032; T:06),
  594.     {G_RM4,2}  (F:$00+O0; M:000; T:00),    {G_RM4,3}  (F:$00+O0; M:000; T:00),
  595.     {G_RM4,4}  (F:$00+O0; M:000; T:00),    {G_RM4,5}  (F:$00+O0; M:000; T:00),
  596.     {G_RM4,6}  (F:$00+O0; M:000; T:00),    {G_RM4,7}  (F:$00+O0; M:000; T:00)),
  597.  
  598.     {G_RM5,0} ((F:$60+O0; M:039; T:12),    {G_RM5,1}  (F:$60+O0; M:032; T:12),
  599.     {G_RM5,2}  (F:$60+O0; M:016; T:12),    {G_RM5,3}  (F:$20+O0; M:016; T:11),
  600.     {G_RM5,4}  (F:$40+O0; M:051; T:12),    {G_RM5,5}  (F:$40+O0; M:051; T:11),
  601.     {G_RM5,6}  (F:$60+O0; M:106; T:12),    {G_RM5,7}  (F:$00+O0; M:000; T:00)),
  602.  
  603.     {G_RM6,0} ((F:$00+O2; M:153; T:20),    {G_RM6,1}  (F:$00+O2; M:161; T:20),
  604.     {G_RM6,2}  (F:$20+O2; M:074; T:20),    {G_RM6,3}  (F:$00+O2; M:085; T:20),
  605.     {G_RM6,4}  (F:$00+O2; M:164; T:20),    {G_RM6,5}  (F:$00+O2; M:165; T:20),
  606.     {G_RM6,6}  (F:$00+O0; M:000; T:00),    {G_RM6,7}  (F:$00+O0; M:000; T:00)),
  607.  
  608.     {G_RM7,0} ((F:$00+O2; M:147; T:41),    {G_RM7,1}  (F:$00+O2; M:152; T:41),
  609.     {G_RM7,2}  (F:$40+O2; M:071; T:41),    {G_RM7,3}  (F:$40+O2; M:073; T:41),
  610.     {G_RM7,4}  (F:$00+O2; M:154; T:20),    {G_RM7,5}  (F:$00+O0; M:000; T:00),
  611.     {G_RM7,6}  (F:$00+O2; M:075; T:20),    {G_RM7,7}  (F:$00+O0; M:000; T:00)),
  612.  
  613.     {G_RM8,0} ((F:$00+O0; M:000; T:00),    {G_RM8,1}  (F:$00+O0; M:000; T:00),
  614.     {G_RM8,2}  (F:$00+O0; M:000; T:00),    {G_RM8,3}  (F:$00+O0; M:000; T:00),
  615.     {G_RM8,4}  (F:$60+O3; M:012; T:16),    {G_RM8,5}  (F:$60+O3; M:015; T:16),
  616.     {G_RM8,6}  (F:$60+O3; M:014; T:16),    {G_RM8,7}  (F:$60+O3; M:013; T:16)),
  617.  
  618.     {G_RM9,0} ((F:$60+O0; M:163; T:02),    {G_RM9,1}  (F:$00+O0; M:000; T:00),
  619.     {G_RM9,2}  (F:$60+O0; M:095; T:00),    {G_RM9,3}  (F:$60+O0; M:093; T:00),
  620.     {G_RM9,4}  (F:$60+O0; M:092; T:50),    {G_RM9,5}  (F:$60+O0; M:037; T:00),
  621.     {G_RM9,6}  (F:$60+O0; M:033; T:00),    {G_RM9,7}  (F:$60+O0; M:036; T:00)));
  622.  
  623.  
  624.  
  625.    MrmTab :    ARRAY[TAdr] OF    { addressing }        {.CP08}
  626.         ARRAY[0..2] OF    { mod values }
  627.         ARRAY[0..7] OF    { R/M values }
  628.  
  629.             TMrm = (
  630.  
  631.     {[Adr16,0,0]}(((D:0; SIB:0; rS:27 {DS}; rB:11 {BX};  rX:14 {SI}),
  632.     {[Adr16,0,1]}  (D:0; SIB:0; rS:27 {DS}; rB:11 {BX};  rX:15 {DI}),
  633.     {[Adr16,0,2]}  (D:0; SIB:0; rS:26 {SS}; rB:13 {BP};  rX:14 {SI}),
  634.     {[Adr16,0,3]}  (D:0; SIB:0; rS:26 {SS}; rB:13 {BP};  rX:15 {DI}),
  635.     {[Adr16,0,4]}  (D:0; SIB:0; rS:27 {DS}; rB:14 {SI};  rX:30 {}),
  636.     {[Adr16,0,5]}  (D:0; SIB:0; rS:27 {DS}; rB:15 {DI};  rX:30 {}),
  637.     {[Adr16,0,6]}  (D:2; SIB:0; rS:27 {DS}; rB:30 {};    rX:30 {}),
  638.     {[Adr16,0,7]}  (D:0; SIB:0; rS:27 {DS}; rB:11 {BX};  rX:30 {})),
  639.  
  640.     {[Adr16,1,0]} ((D:1; SIB:0; rS:27 {DS}; rB:11 {BX};  rX:14 {SI}),
  641.     {[Adr16,1,1]}  (D:1; SIB:0; rS:27 {DS}; rB:11 {BX};  rX:15 {DI}),
  642.     {[Adr16,1,2]}  (D:1; SIB:0; rS:26 {SS}; rB:13 {BP};  rX:14 {SI}),
  643.     {[Adr16,1,3]}  (D:1; SIB:0; rS:26 {SS}; rB:13 {BP};  rX:15 {DI}),
  644.     {[Adr16,1,4]}  (D:1; SIB:0; rS:27 {DS}; rB:14 {SI};  rX:30 {}),
  645.     {[Adr16,1,5]}  (D:1; SIB:0; rS:27 {DS}; rB:15 {DI};  rX:30 {}),
  646.     {[Adr16,1,6]}  (D:1; SIB:0; rS:26 {SS}; rB:13 {BP};  rX:30 {}),
  647.     {[Adr16,1,7]}  (D:1; SIB:0; rS:27 {DS}; rB:11 {BX};  rX:30 {})),
  648.  
  649.     {[Adr16,2,0]} ((D:2; SIB:0; rS:27 {DS}; rB:11 {BX};  rX:14 {SI}),
  650.     {[Adr16,2,1]}  (D:2; SIB:0; rS:27 {DS}; rB:11 {BX};  rX:15 {DI}),
  651.     {[Adr16,2,2]}  (D:2; SIB:0; rS:26 {SS}; rB:13 {BP};  rX:14 {SI}),
  652.     {[Adr16,2,3]}  (D:2; SIB:0; rS:26 {SS}; rB:13 {BP};  rX:15 {DI}),
  653.     {[Adr16,2,4]}  (D:2; SIB:0; rS:27 {DS}; rB:14 {SI};  rX:30 {}),
  654.     {[Adr16,2,5]}  (D:2; SIB:0; rS:27 {DS}; rB:15 {DI};  rX:30 {}),
  655.     {[Adr16,2,6]}  (D:2; SIB:0; rS:26 {SS}; rB:13 {BP};  rX:30 {}),
  656.     {[Adr16,2,7]}  (D:2; SIB:0; rS:27 {DS}; rB:11 {BX};  rX:30 {}))),
  657.  
  658.     {[Adr32,0,0]}(((D:0; SIB:0; rS:27 {DS}; rB:16 {EAX}; rX:30 {}),
  659.     {[Adr32,0,1]}  (D:0; SIB:0; rS:27 {DS}; rB:17 {ECX}; rX:30 {}),
  660.     {[Adr32,0,2]}  (D:0; SIB:0; rS:27 {DS}; rB:18 {EDX}; rX:30 {}),
  661.     {[Adr32,0,3]}  (D:0; SIB:0; rS:27 {DS}; rB:19 {EBX}; rX:30 {}),
  662.     {[Adr32,0,4]}  (D:0; SIB:1; rS:30 {};   rB:30 {};    rX:30 {}),
  663.     {[Adr32,0,5]}  (D:4; SIB:0; rS:27 {DS}; rB:30 {};    rX:30 {}),
  664.     {[Adr32,0,6]}  (D:0; SIB:0; rS:27 {DS}; rB:22 {ESI}; rX:30 {}),
  665.     {[Adr32,0,7]}  (D:0; SIB:0; rS:27 {DS}; rB:23 {EDI}; rX:30 {})),
  666.  
  667.     {[Adr32,1,0]} ((D:1; SIB:0; rS:27 {DS}; rB:16 {EAX}; rX:30 {}),
  668.     {[Adr32,1,1]}  (D:1; SIB:0; rS:27 {DS}; rB:17 {ECX}; rX:30 {}),
  669.     {[Adr32,1,2]}  (D:1; SIB:0; rS:27 {DS}; rB:18 {EDX}; rX:30 {}),
  670.     {[Adr32,1,3]}  (D:1; SIB:0; rS:27 {DS}; rB:19 {EBX}; rX:30 {}),
  671.     {[Adr32,1,4]}  (D:0; SIB:1; rS:30 {};   rB:30 {};    rX:30 {}),
  672.     {[Adr32,1,5]}  (D:1; SIB:0; rS:26 {SS}; rB:21 {EBP}; rX:30 {}),
  673.     {[Adr32,1,6]}  (D:1; SIB:0; rS:27 {DS}; rB:22 {ESI}; rX:30 {}),
  674.     {[Adr32,1,7]}  (D:1; SIB:0; rS:27 {DS}; rB:23 {EDI}; rX:30 {})),
  675.  
  676.     {[Adr32,2,0]} ((D:4; SIB:0; rS:27 {DS}; rB:16 {EAX}; rX:30 {}),
  677.     {[Adr32,2,1]}  (D:4; SIB:0; rS:27 {DS}; rB:17 {ECX}; rX:30 {}),
  678.     {[Adr32,2,2]}  (D:4; SIB:0; rS:27 {DS}; rB:18 {EDX}; rX:30 {}),
  679.     {[Adr32,2,3]}  (D:4; SIB:0; rS:27 {DS}; rB:19 {EBX}; rX:30 {}),
  680.     {[Adr32,2,4]}  (D:0; SIB:1; rS:30 {};   rB:30 {};    rX:30 {}),
  681.     {[Adr32,2,5]}  (D:4; SIB:0; rS:26 {SS}; rB:21 {EBP}; rX:30 {}),
  682.     {[Adr32,2,6]}  (D:4; SIB:0; rS:27 {DS}; rB:22 {ESI}; rX:30 {}),
  683.     {[Adr32,2,7]}  (D:4; SIB:0; rS:27 {DS}; rB:23 {EDI}; rX:30 {}))));
  684.  
  685.    RegList : ARRAY[00..41] OF STRING[3] = (            {.CP13}
  686.  
  687.     {00}  'AL',     {01}  'CL',     {02}  'DL',     {03}  'BL',
  688.     {04}  'AH',     {05}  'CH',     {06}  'DH',     {07}  'BH', 
  689.     {08}  'AX',     {09}  'CX',     {10}  'DX',     {11}  'BX',
  690.     {12}  'SP',     {13}  'BP',     {14}  'SI',     {15}  'DI',
  691.     {16}  'EAX',    {17}  'ECX',    {18}  'EDX',    {19}  'EBX',
  692.     {20}  'ESP',    {21}  'EBP',    {22}  'ESI',    {23}  'EDI',
  693.     {24}  'ES',     {25}  'CS',     {26}  'SS',     {27}  'DS',
  694.     {28}  'FS',     {29}  'GS',     {30}  '',    {31}  '1',
  695.     {32}  '3',    {33}  'a',    {34}  'b',    {35}  'd',
  696.     {36}  'p',    {37}  's',    {38}  'v',    {39}  'w',
  697.     {40}  'q',    {41}  't');
  698.  
  699.  
  700.    RegDecode :  ARRAY[TAdr] OF                    {.CP12}
  701.         ARRAY[WBitStatus] OF
  702.         ARRAY[0..7] OF BYTE = (  {decodes GP Reg fields}
  703.  
  704.    {[Adr16,W0,0]}    ((00 {AL},  01 {CL},  02 {DL},  03 {BL},
  705.               04 {AH},  05 {CH},  06 {DH},  07 {BH}),
  706.    {[Adr16,W1,0]}     (08 {AX},  09 {CX},  10 {DX},  11 {BX},
  707.               12 {SP},  13 {BP},  14 {SI},  15 {DI})),
  708.    {[Adr32,W0,0]}    ((00 {AL},  01 {CL},  02 {DL},  03 {BL},
  709.               04 {AH},  05 {CH},  06 {DH},  07 {BH}),
  710.    {[Adr32,W1,0]}     (16 {EAX}, 17 {ECX}, 18 {EDX}, 19 {EBX},
  711.               20 {ESP}, 21 {EBP}, 22 {ESI}, 23 {EDI})));
  712.  
  713.  
  714.      SibTab :    ARRAY[0..2] OF  { mrmMOD indexes this }        {.CP28}
  715.         ARRAY[0..7] OF  { sibBAS indexes this }
  716.         SibRec = (
  717.  
  718.     {[0,0]}  ((D: 0; rS: 27 {DS}; rB: 16 {EAX}),
  719.     {[0,1]}   (D: 0; rS: 27 {DS}; rB: 17 {ECX}),
  720.     {[0,2]}   (D: 0; rS: 27 {DS}; rB: 18 {EDX}),
  721.     {[0,3]}   (D: 0; rS: 27 {DS}; rB: 19 {EBX}),
  722.     {[0,4]}   (D: 0; rS: 26 {SS}; rB: 20 {ESP}),
  723.     {[0,5]}   (D: 4; rS: 27 {DS}; rB: 30 {}),
  724.     {[0,6]}   (D: 0; rS: 27 {DS}; rB: 22 {ESI}),
  725.     {[0,7]}   (D: 0; rS: 27 {DS}; rB: 23 {EDI})),
  726.     {[1,0]}  ((D: 1; rS: 27 {DS}; rB: 16 {EAX}),
  727.     {[1,1]}   (D: 1; rS: 27 {DS}; rB: 17 {ECX}),
  728.     {[1,2]}   (D: 1; rS: 27 {DS}; rB: 18 {EDX}),
  729.     {[1,3]}   (D: 1; rS: 27 {DS}; rB: 19 {EBX}),
  730.     {[1,4]}   (D: 1; rS: 26 {SS}; rB: 21 {EBP}),
  731.     {[1,5]}   (D: 1; rS: 26 {SS}; rB: 20 {ESP}),
  732.     {[1,6]}   (D: 1; rS: 27 {DS}; rB: 22 {ESI}),
  733.     {[1,7]}   (D: 1; rS: 27 {DS}; rB: 23 {EDI})),
  734.     {[2,0]}  ((D: 4; rS: 27 {DS}; rB: 16 {EAX}),
  735.     {[2,1]}   (D: 4; rS: 27 {DS}; rB: 17 {ECX}),
  736.     {[2,2]}   (D: 4; rS: 27 {DS}; rB: 18 {EDX}),
  737.     {[2,3]}   (D: 4; rS: 27 {DS}; rB: 19 {EBX}),
  738.     {[2,4]}   (D: 4; rS: 26 {SS}; rB: 21 {EBP}),
  739.     {[2,5]}   (D: 4; rS: 26 {SS}; rB: 20 {ESP}),
  740.     {[2,6]}   (D: 4; rS: 27 {DS}; rB: 22 {ESI}),
  741.     {[2,7]}   (D: 4; rS: 27 {DS}; rB: 23 {EDI})));
  742.  
  743.  
  744.    sxTab :    ARRAY[0..3] OF   {   ss  field indexes this }    {.CP20}
  745.         ARRAY[0..7] OF   { index field indexes this }
  746.             sxRec = (
  747.  
  748.     {[0,0]} ((rX: 16 {EAX}; sF: 1),  {[0,1]} (rX: 17 {ECX}; sF: 1),
  749.     {[0,2]}  (rX: 18 {EDX}; sF: 1),  {[0,3]} (rX: 19 {EBX}; sF: 1),
  750.     {[0,4]}  (rX: 30 {};    sF: 0),  {[0,5]} (rX: 21 {EBP}; sF: 1),
  751.     {[0,6]}  (rX: 22 {ESI}; sF: 1),  {[0,7]} (rX: 23 {EDI}; sF: 1)),
  752.     {[1,0]} ((rX: 16 {EAX}; sF: 2),  {[1,1]} (rX: 17 {ECX}; sF: 2),
  753.     {[1,2]}  (rX: 18 {EDX}; sF: 2),  {[1,3]} (rX: 19 {EBX}; sF: 2),
  754.     {[1,4]}  (rX: 30 {};    sF: 0),  {[1,5]} (rX: 21 {EBP}; sF: 2),
  755.     {[1,6]}  (rX: 22 {ESI}; sF: 2),  {[1,7]} (rX: 23 {EDI}; sF: 2)),
  756.     {[2,0]} ((rX: 16 {EAX}; sF: 4),  {[2,1]} (rX: 17 {ECX}; sF: 4),
  757.     {[2,2]}  (rX: 18 {EDX}; sF: 4),  {[2,3]} (rX: 19 {EBX}; sF: 4),
  758.     {[2,4]}  (rX: 30 {};    sF: 0),  {[2,5]} (rX: 21 {EBP}; sF: 4),
  759.     {[2,6]}  (rX: 22 {ESI}; sF: 4),  {[2,7]} (rX: 23 {EDI}; sF: 4)),
  760.     {[3,0]} ((rX: 16 {EAX}; sF: 8),  {[3,1]} (rX: 17 {ECX}; sF: 8),
  761.     {[3,2]}  (rX: 18 {EDX}; sF: 8),  {[3,3]} (rX: 19 {EBX}; sF: 8),
  762.     {[3,4]}  (rX: 30 {};    sF: 0),  {[3,5]} (rX: 21 {EBP}; sF: 8),
  763.     {[3,6]}  (rX: 22 {ESI}; sF: 8),  {[3,7]} (rX: 23 {EDI}; sF: 8)));
  764.  
  765.     { -------------------------------------------- }    {.CP44}
  766.     { Control Tables for 80387 Instructions Follow }
  767.     { -------------------------------------------- }
  768.  
  769. { 387 EA table;    1st index = ESC group;
  770.         2nd index = REG field;
  771. }
  772.  
  773.    MpuEA :    ARRAY[0..7] OF
  774.         ARRAY[0..7] OF MpuVec = (  { used if mod <> 3 }
  775.  
  776.  
  777.     {[0,0]} ((F: $18;M: 03),    {[0,1]}  (F: $18;M: 44),
  778.     {[0,2]}  (F: $18;M: 09),    {[0,3]}  (F: $18;M: 10),
  779.     {[0,4]}  (F: $18;M: 64),    {[0,5]}  (F: $18;M: 66),
  780.     {[0,6]}  (F: $18;M: 15),    {[0,7]}  (F: $18;M: 17)),
  781.     {[1,0]} ((F: $18;M: 34),    {[1,1]}  (F: $00;M: 00),
  782.     {[1,2]}  (F: $18;M: 59),    {[1,3]}  (F: $18;M: 62),
  783.     {[1,4]}  (F: $13;M: 37),    {[1,5]}  (F: $14;M: 36),
  784.     {[1,6]}  (F: $13;M: 61),    {[1,7]}  (F: $14;M: 60)),
  785.     {[2,0]} ((F: $15;M: 21),    {[2,1]}  (F: $15;M: 27),
  786.     {[2,2]}  (F: $15;M: 22),    {[2,3]}  (F: $15;M: 23),
  787.     {[2,4]}  (F: $15;M: 32),    {[2,5]}  (F: $15;M: 33),
  788.     {[2,6]}  (F: $15;M: 24),    {[2,7]}  (F: $15;M: 25)),
  789.     {[3,0]} ((F: $15;M: 26),    {[3,1]}  (F: $00;M: 00),
  790.     {[3,2]}  (F: $15;M: 30),    {[3,3]}  (F: $15;M: 31),
  791.     {[3,4]}  (F: $00;M: 00),    {[3,5]}  (F: $1A;M: 34),
  792.     {[3,6]}  (F: $00;M: 00),    {[3,7]}  (F: $1A;M: 62)),
  793.     {[4,0]} ((F: $19;M: 03),    {[4,1]}  (F: $19;M: 44),
  794.     {[4,2]}  (F: $19;M: 09),    {[4,3]}  (F: $19;M: 10),
  795.     {[4,4]}  (F: $19;M: 64),    {[4,5]}  (F: $19;M: 66),
  796.     {[4,6]}  (F: $19;M: 15),    {[4,7]}  (F: $19;M: 17)),
  797.     {[5,0]} ((F: $19;M: 34),    {[5,1]}  (F: $00;M: 00),
  798.     {[5,2]}  (F: $19;M: 59),    {[5,3]}  (F: $19;M: 62),
  799.     {[5,4]}  (F: $13;M: 52),    {[5,5]}  (F: $00;M: 00),
  800.     {[5,6]}  (F: $13;M: 53),    {[5,7]}  (F: $14;M: 63)),
  801.     {[6,0]} ((F: $16;M: 21),    {[6,1]}  (F: $16;M: 27),
  802.     {[6,2]}  (F: $16;M: 22),    {[6,3]}  (F: $16;M: 23),
  803.     {[6,4]}  (F: $16;M: 32),    {[6,5]}  (F: $16;M: 33),
  804.     {[6,6]}  (F: $16;M: 24),    {[6,7]}  (F: $16;M: 25)),
  805.     {[7,0]} ((F: $16;M: 26),    {[7,1]}  (F: $00;M: 00),
  806.     {[7,2]}  (F: $16;M: 30),    {[7,3]}  (F: $16;M: 31),
  807.     {[7,4]}  (F: $12;M: 05),    {[7,5]}  (F: $17;M: 26),
  808.     {[7,6]}  (F: $12;M: 06),    {[7,7]}  (F: $17;M: 31)));
  809.  
  810.  
  811. { 387 mod=3 table part 1; use when mod field = 3 to access flags   }{.CP37}
  812.  
  813.    MpuM11 :    ARRAY[0..7] OF
  814.         ARRAY[0..7] OF MpuVec = ( {M: is index to MpuOv }
  815.  
  816.     {[0,0]} ((F: $1D; M: 01),    {[0,1]}  (F: $1D; M: 02),
  817.     {[0,2]}  (F: $1D; M: 03),    {[0,3]}  (F: $1D; M: 04),
  818.     {[0,4]}  (F: $1D; M: 05),    {[0,5]}  (F: $1D; M: 06),
  819.     {[0,6]}  (F: $1D; M: 07),    {[0,7]}  (F: $1D; M: 08)),
  820.     {[1,0]} ((F: $1B; M: 09),    {[1,1]}  (F: $1B; M: 10),
  821.     {[1,2]}  (F: $20; M: 11),    {[1,3]}  (F: $00; M: 00),
  822.     {[1,4]}  (F: $20; M: 12),    {[1,5]}  (F: $20; M: 13),
  823.     {[1,6]}  (F: $20; M: 14),    {[1,7]}  (F: $20; M: 15)),
  824.     {[2,0]} ((F: $00; M: 00),    {[2,1]}  (F: $00; M: 00),
  825.     {[2,2]}  (F: $00; M: 00),    {[2,3]}  (F: $00; M: 00),
  826.     {[2,4]}  (F: $00; M: 00),    {[2,5]}  (F: $20; M: 16),
  827.     {[2,6]}  (F: $00; M: 00),    {[2,7]}  (F: $00; M: 00)),
  828.     {[3,0]} ((F: $00; M: 00),    {[3,1]}  (F: $00; M: 00),
  829.     {[3,2]}  (F: $00; M: 00),    {[3,3]}  (F: $00; M: 00),
  830.     {[3,4]}  (F: $20; M: 17),    {[3,5]}  (F: $00; M: 00),
  831.     {[3,6]}  (F: $00; M: 00),    {[3,7]}  (F: $00; M: 00)),
  832.     {[4,0]} ((F: $1C; M: 18),    {[4,1]}  (F: $1C; M: 19),
  833.     {[4,2]}  (F: $1C; M: 20),    {[4,3]}  (F: $1C; M: 21),
  834.     {[4,4]}  (F: $1C; M: 22),    {[4,5]}  (F: $1C; M: 23),
  835.     {[4,6]}  (F: $1C; M: 24),    {[4,7]}  (F: $1C; M: 25)),
  836.     {[5,0]} ((F: $1B; M: 26),    {[5,1]}  (F: $00; M: 00),
  837.     {[5,2]}  (F: $1B; M: 27),    {[5,3]}  (F: $1B; M: 28),
  838.     {[5,4]}  (F: $1B; M: 29),    {[5,5]}  (F: $1B; M: 30),
  839.     {[5,6]}  (F: $00; M: 00),    {[5,7]}  (F: $00; M: 00)),
  840.     {[6,0]} ((F: $1C; M: 31),    {[6,1]}  (F: $1C; M: 32),
  841.     {[6,2]}  (F: $00; M: 00),    {[6,3]}  (F: $20; M: 33),
  842.     {[6,4]}  (F: $1C; M: 34),    {[6,5]}  (F: $1C; M: 35),
  843.     {[6,6]}  (F: $1C; M: 36),    {[6,7]}  (F: $1C; M: 37)),
  844.     {[7,0]} ((F: $00; M: 00),    {[7,1]}  (F: $00; M: 00),
  845.     {[7,2]}  (F: $00; M: 00),    {[7,3]}  (F: $00; M: 00),
  846.     {[7,4]}  (F: $21; M: 38),    {[7,5]}  (F: $00; M: 00),
  847.     {[7,6]}  (F: $00; M: 00),    {[7,7]}  (F: $00; M: 00)));
  848.  
  849. { 387 mod=3 table part 2; use when mod field = 3 to find mnemonic  }{.CP46}
  850.  
  851.    MpuOv :    ARRAY[01..38] OF
  852.         ARRAY[00..07] OF Byte = (
  853.  
  854.     {                   R/M Values
  855.                 (00,01,02,03,04,05,06,07)
  856.     esc,reg             -- -- -- -- -- -- -- --        }
  857.     {[0,0]-->link[01]}    (03,03,03,03,03,03,03,03), {FADD}
  858.     {[0,1]-->link[02]}    (44,44,44,44,44,44,44,44), {FMUL}
  859.     {[0,2]-->link[03]}    (09,09,09,09,09,09,09,09), {FCOM}
  860.     {[0,3]-->link[04]}    (10,10,10,10,10,10,10,10), {FCOMP}
  861.     {[0,4]-->link[05]}    (64,64,64,64,64,64,64,64), {FSUB}
  862.     {[0,5]-->link[06]}    (66,66,66,66,66,66,66,66), {FSUBR}
  863.     {[0,6]-->link[07]}    (15,15,15,15,15,15,15,15), {FDIV}
  864.     {[0,7]-->link[08]}    (17,17,17,17,17,17,17,17), {FDIVR}
  865.     {[1,0]-->link[09]}    (34,34,34,34,34,34,34,34), {FLD}
  866.     {[1,1]-->link[10]}    (73,73,73,73,73,73,73,73), {FXCH}
  867.     {[1,2]-->link[11]}    (46,00,00,00,00,00,00,00), {FNOP,err..}
  868.     {[1,4]-->link[12]}    (07,02,00,00,68,72,00,00), {FCHS..FXAM}
  869.     {[1,5]-->link[13]}    (35,40,39,42,38,41,43,00), {FLD1..FLDZ}
  870.     {[1,6]-->link[14]}    (01,75,50,47,74,49,13,28), {F2XM1..FINCSTP}
  871.     {[1,7]-->link[15]}    (48,76,58,57,51,54,56,12), {FPREM..FCOS}
  872.     {[2,5]-->link[16]}    (00,71,00,00,00,00,00,00), {FUCOMPP}
  873.     {[3,4]-->link[17]}    (19,14,08,29,55,00,00,00), {FENI..FSETPM}
  874.     {[4,0]-->link[18]}    (03,03,03,03,03,03,03,03), {FADD}
  875.     {[4,1]-->link[19]}    (44,44,44,44,44,44,44,44), {FMUL}
  876.     {[4,2]-->link[20]}    (09,09,09,09,09,09,09,09), {FCOM}
  877.     {[4,3]-->link[21]}    (10,10,10,10,10,10,10,10), {FCOMP}
  878.     {[4,4]-->link[22]}    (64,64,64,64,64,64,64,64), {FSUB}
  879.     {[4,5]-->link[23]}    (66,66,66,66,66,66,66,66), {FSUBR}
  880.     {[4,6]-->link[24]}    (15,15,15,15,15,15,15,15), {FDIV}
  881.     {[4,7]-->link[25]}    (17,17,17,17,17,17,17,17), {FDIVR}
  882.     {[5,0]-->link[26]}    (20,20,20,20,20,20,20,20), {FFREE}
  883.     {[5,2]-->link[27]}    (59,59,59,59,59,59,59,59), {FST}
  884.     {[5,3]-->link[28]}    (62,62,62,62,62,62,62,62), {FSTP}
  885.     {[5,4]-->link[29]}    (69,69,69,69,69,69,69,69), {FUCOM}
  886.     {[5,5]-->link[30]}    (70,70,70,70,70,70,70,70), {FUCOMP}
  887.     {[6,0]-->link[31]}    (04,04,04,04,04,04,04,04), {FADDP}
  888.     {[6,1]-->link[32]}    (45,45,45,45,45,45,45,45), {FMULP}
  889.     {[6,3]-->link[33]}    (00,11,00,00,00,00,00,00), {FCOMPP}
  890.     {[6,4]-->link[34]}    (65,65,65,65,65,65,65,65), {FSUBP}
  891.     {[6,5]-->link[35]}    (67,67,67,67,67,67,67,67), {FSUBRP}
  892.     {[6,6]-->link[36]}    (16,16,16,16,16,16,16,16), {FDIVP}
  893.     {[6,7]-->link[37]}    (18,18,18,18,18,18,18,18), {FDIVRP}
  894.     {[7,4]-->link[38]}    (63,00,00,00,00,00,00,00));{FSTSW}
  895.  
  896. Const    EmuFlag : Byte = $0;
  897.  
  898. VAR                                {.CP32}
  899.     Is_386Xtnsn,    Is_32BitMax,    Is_16BitMin,    Is_SignXtnd,
  900.     Is_MODrmFld,    HaveSizePfx,    HaveAddrPfx,    HaveMRM,
  901.     HaveSIB,    FetchFailure,    DSiz32,        ASiz32,
  902.     HaveSegPfx,    HaveInstPfx,    HaveMemOprnd    : Boolean;
  903.  
  904.     CpuAuth        : CpuGate;
  905.  
  906.     CodeByte,    PfxMax,        OprBytes,    DataByte,
  907.     DLoc,        mrmMOD,        mrmREG,        mrmRM,
  908.     IPfx,        sibSS,        sibNDX,        sibBAS,
  909.     SPfx                            : Byte;
  910.  
  911.     BytesFetched,    BytesRemaining,    PrefixBytes,    CodeSeg,
  912.     CodeOfs,    VirtualIP                : Word;
  913.  
  914.         CodeBase                        : LongInt;
  915.  
  916.     REGOperand,    REGSeg,        REGBase,
  917.     REGIndex,    REGSegOvr            : REGString;
  918.  
  919.     EAOperand,    CodeText,    Mnemonic    : OprStr;
  920.  
  921.     CodeStack    : ARRAY[1..16] OF Byte;
  922.     Opnd         : ARRAY[1..3]  OF OprStr;
  923.     ActGroup    : CpuVec;
  924.     OpTags        : TagGrp;
  925.     NdxSF        : String[2];
  926.  
  927.     ByteGate    : Gating;
  928.     AddrMode    : TAdr;
  929.     WBitMode    : WBitStatus;
  930.  
  931.     { --------------------------------------------- }    {.CP18}
  932.     { Fetches a Byte and stacks it for Disassembler }
  933.     { --------------------------------------------- }
  934.  
  935. FUNCTION FetchByte : Byte;
  936. BEGIN
  937.     FetchFailure := BytesRemaining = 0;
  938.     IF NOT FetchFailure THEN
  939.     BEGIN
  940.         Inc(BytesFetched);
  941.         {$R+}
  942.         CodeStack[BytesFetched] := Mem[CodeSeg:CodeOfs];
  943.         {$R-}
  944.         Dec(BytesRemaining);
  945.         Inc(CodeOfs);
  946.     END;
  947.         FetchByte := CodeStack[BytesFetched]
  948. END;
  949.  
  950.     { ----------------------------------------------- }    {.CP13}
  951.     { Undoes the Fetch Byte Process - Pops From Stack }
  952.     { ----------------------------------------------- }
  953.  
  954. PROCEDURE UnFetchCodeByte;
  955. BEGIN
  956.     IF BytesFetched > 0 THEN
  957.     BEGIN
  958.         Dec(BytesFetched);
  959.         Inc(BytesRemaining);
  960.         Dec(CodeOfs);
  961.     END
  962. END;
  963.  
  964.     { ------------------------------------------------- }    {.CP13}
  965.     { Formats a Sequence of Stacked Bytes as printable  }
  966.     { Hex in "logical" order - not processor order, and }
  967.     { appends a Padding String and a Blank            }
  968.     { ------------------------------------------------- }
  969.  
  970. PROCEDURE FormatText(Locn, SLen:Byte; Pad : String);
  971. VAR  W : OprStr; i : Byte;
  972. BEGIN
  973.     W := '';
  974.     FOR i := Locn TO Locn+SLen-1 DO W := HexB(CodeStack[i]) + W;
  975.     CodeText := CodeText + W + Pad + ' ';
  976. END;
  977.  
  978.     { ------------------- }                    {.CP11}
  979.     { Unpacks modR/M Byte }
  980.     { ------------------- }
  981.  
  982. PROCEDURE UnPackModRM(modRM : Byte);
  983. BEGIN
  984.     HaveMRM := True;
  985.     mrmMOD := (modRM SHR 6) AND $03;
  986.     mrmREG := (modRM SHR 3) AND $07;
  987.     mrmRM  :=  modRM AND $07;
  988. END;
  989.  
  990.     { ---------------- }                    {.CP11}
  991.     { Unpacks SIB Byte }
  992.     { ---------------- }
  993.  
  994. PROCEDURE UnPackSIB(sib : Byte);
  995. BEGIN
  996.     HaveSIB := True;
  997.     sibSS   := (sib SHR 6) AND $03;
  998.     sibNDX  := (sib SHR 3) AND $07;
  999.     sibBAS  :=  sib AND $07;
  1000. END;
  1001.  
  1002. PROCEDURE MergeActGrp(VAR Z : CpuVec);                {.CP10}
  1003. VAR I,J : Byte;
  1004. BEGIN
  1005.     ActGroup.M := Z.M;
  1006.     IF Z.T <> 0 THEN ActGroup.T := Z.T;
  1007.     I := ActGroup.F AND $7;
  1008.     J := Z.F AND $7;
  1009.     IF I < J THEN I := J;
  1010.     ActGroup.F := ((ActGroup.F OR Z.F) AND $F8) OR I;
  1011. END;
  1012.  
  1013.     { ------------------------------------------------- }    {.CP52}
  1014.     { Formats a Sequence of Stacked Bytes as printable  }
  1015.     { Hex in "logical" order - not processor order for  }
  1016.     { use in Operand Expressions.  Lead zero suppressed }
  1017.     { May be SIGNED or UN-SIGNED                        }
  1018.     { ------------------------------------------------- }
  1019.  
  1020. PROCEDURE FormatDispl(VAR Sx:OprStr; Locn, SLen:Byte; Signed:Boolean);
  1021. TYPE
  1022.   MyWord = RECORD
  1023.     CASE Byte OF
  1024.         0: (Ds : ShortInt);
  1025.         1: (Db : Byte);
  1026.         2: (Dw : Word);
  1027.         3: (Di : Integer);
  1028.         4: (Dd : LongInt);
  1029.         5: (Dv : ARRAY[1..4] OF Byte);
  1030.     END;
  1031.  
  1032. VAR    W, X : MyWord; I : Byte; P : ^MyWord; Signit : Char;
  1033. BEGIN
  1034.     Sx := '';
  1035.     IF SLen IN [1,2,4] THEN
  1036.     BEGIN
  1037.         P := @ CodeStack[Locn];
  1038.         W.Dd := 0; X := W;
  1039.         WITH P^ DO
  1040.         IF Signed THEN
  1041.         BEGIN            { sign extend for next step }
  1042.             CASE SLen OF
  1043.                 1: W.Dd := Ds;
  1044.                 2: W.Dd := Di;
  1045.                 4: W.Dd := Dd
  1046.             END;
  1047.             X.Dd := Abs(W.Dd)
  1048.         END ELSE
  1049.         BEGIN            { zero extend for next step }
  1050.             CASE SLen OF
  1051.                 1: W.Dd := Db;
  1052.                 2: W.Dd := Dw;
  1053.                 4: W.Dd := Dd
  1054.             END;
  1055.             X.Dd := W.Dd
  1056.         END;
  1057.         FOR i := 1 TO SLen DO Sx := HexB(X.Dv[i]) + Sx;
  1058.         IF X.Dd <> W.Dd
  1059.             THEN Signit := '-'
  1060.             ELSE Signit := '+';
  1061.         Sx := Sx + 'h';
  1062.         IF Signed THEN Sx := Signit + Sx;
  1063.     END;
  1064. END; {FormatDispl}
  1065.  
  1066.     { ------------------------------------ }        {.CP22}
  1067.     { ERROR - Stacked Code printed as DB's }
  1068.     { ------------------------------------ }
  1069.  
  1070. PROCEDURE EmitConstants;
  1071. VAR c : Char;
  1072. BEGIN
  1073.     WHILE BytesFetched > 1 DO UnFetchCodeByte;
  1074.     Mnemonic := 'DB';
  1075.     CodeText := '';
  1076.     HaveInstPfx := False;
  1077.     c := Char(CodeStack[1]);
  1078.     CodeText := HexB(Byte(c));
  1079.     CASE c OF
  1080.         ' '..'&',
  1081.         '('..#$7F:    Opnd[1] := '''' + c + '''';
  1082.         ELSE        Opnd[1] := '0' + CodeText + 'h';
  1083.     END;
  1084.     Opnd[2] := '';
  1085.     Opnd[3] := '';
  1086.     { Ready to Build and Print Line }
  1087. END;
  1088.  
  1089.     { --------------------- }                {.CP08}
  1090.     { Returns Register Name }
  1091.     { --------------------- }
  1092.  
  1093. FUNCTION ExtractReg(Am : TAdr; Wbit : WBitStatus; Arg : Byte) : RegString;
  1094. BEGIN
  1095.     ExtractReg := RegList[RegDecode[Am,Wbit,Arg]]
  1096. END;
  1097.  
  1098.     { ----------------------------------- }            {.CP12}
  1099.     { Fetches Displacement/Immediate Data }
  1100.     { ----------------------------------- }
  1101.  
  1102. FUNCTION FetchDispl(Width:Byte) : Byte; { Index to LSB of Displ }
  1103. VAR i, j : Byte;
  1104. BEGIN
  1105.     FOR i := 1 TO Width DO j := FetchByte;
  1106.     IF FetchFailure
  1107.         THEN FetchDispl := 0
  1108.         ELSE FetchDispl := BytesFetched + 1 - Width;
  1109. END;
  1110.  
  1111.     { ------------------------------- }            {.CP05}
  1112.     { Decodes and Stacks Prefix Bytes }
  1113.     { ------------------------------- }
  1114.  
  1115. PROCEDURE HandlePrefix;
  1116.  
  1117.     PROCEDURE StowPrefix;                    {.CP49}
  1118.     CONST PfxFlg : ARRAY[1..4] OF CHAR = '>||:';
  1119.     VAR PfxCls : 1..4; i : Byte;
  1120.     BEGIN
  1121.         CASE CodeByte OF
  1122.            $F0,    $F2..$F3:    BEGIN    {LOCK/REPE/REPNE}
  1123.                         PfxCls := 1;
  1124.                         IPfx := CodeByte;
  1125.                         HaveInstPfx := True;
  1126.                     END;
  1127.             $67:        BEGIN   {Address Size Prefix}
  1128.                         PfxCls := 2;
  1129.                         ASiz32 := NOT SegDBit;
  1130.                         HaveAddrPfx := True;
  1131.                     END;
  1132.             $66:        BEGIN   {Operand Size Prefix}
  1133.                         PfxCls := 3;
  1134.                         DSiz32 := NOT SegDBit;
  1135.                         HaveSizePfx := True;
  1136.                     END;
  1137.             $26,$2E,
  1138.             $36,$3E:    BEGIN   {Segment Prefix ES,CS,SS,DS}
  1139.                         PfxCls := 4;
  1140.                         SPfx := BytesFetched;
  1141.                         HaveSegPfx := True;
  1142.                         i := CodeByte SHR 3 AND $03;
  1143.                         REGSegOvr := RegList[i + 24];
  1144.                     END;
  1145.             $64,$65:    BEGIN   {Segment Prefix FS,GS}
  1146.                         PfxCls := 4;
  1147.                         SPfx := BytesFetched;
  1148.                         HaveSegPfx := True;
  1149.                         i := CodeByte AND $07;
  1150.                         REGSegOvr := RegList[i + 24];
  1151.                     END;
  1152.         END;
  1153.         IF PfxCls > PfxMax THEN
  1154.         BEGIN
  1155.             Inc(PrefixBytes);
  1156.             PfxMax := PfxCls;
  1157.             FormatText(BytesFetched,1,PfxFlg[PfxCls]);
  1158.         END ELSE
  1159.         BEGIN
  1160.             UnFetchCodeByte;   { will fetch again later  }
  1161.             EmitConstants;     { emit code stack as DB's }
  1162.             PrefixBytes := 0; PfxMax := 0;
  1163.             HaveAddrPfx := False; HaveSizePfx := False;
  1164.         END;
  1165.     END; {StowPrefix}
  1166.  
  1167. BEGIN {HandlePrefix}                        {.CP12}
  1168.     IF NOT FetchFailure THEN
  1169.     IF (ActLvl1[CodeByte].F AND $7) > Ord(CpuAuth) THEN
  1170.     BEGIN   EmitConstants; ByteGate := G_ooo END ELSE
  1171.     BEGIN
  1172.         StowPrefix;
  1173.         CodeByte := FetchByte;
  1174.         IF NOT FetchFailure
  1175.             THEN ByteGate := GateLvl1[CodeByte]
  1176.             ELSE ByteGate := G_ooo;
  1177.     END;
  1178. END; {HandlePrefix}
  1179.  
  1180.     { -------------------------------------- }        {.CP45}
  1181.     { Interprets modR/M and optional SIB to  }
  1182.     { get operand strings.  Fetches required }
  1183.     { displacement fields if any.         }
  1184.     { -------------------------------------- }
  1185.  
  1186. PROCEDURE DecodeModRM(W :WBitStatus);
  1187. VAR wmrm : TMrm; wsib : SibRec; wsx : sxRec; Sx : OprStr;
  1188. BEGIN
  1189.     IF mrmMOD = 3 THEN EAOperand := ExtractReg(AddrMode,W,mrmRM)
  1190.     ELSE
  1191.     BEGIN
  1192.         wmrm     := MrmTab[AddrMode,mrmMOD,mrmRM];
  1193.         IF wmrm.SIB = 1 THEN
  1194.         BEGIN
  1195.             DataByte := FetchByte;
  1196.             FormatText(BytesFetched,1,'');
  1197.             UnPackSIB(DataByte);
  1198.             wsib := SibTab[mrmMOD,sibBAS];
  1199.             wsx  := sxTAB[sibSS,sibNDX];
  1200.             wmrm.D := wsib.D;
  1201.             wmrm.rS := wsib.rS;
  1202.             wmrm.rB := wsib.rB;
  1203.             wmrm.rX := wsx.rX;
  1204.             IF wsx.SF = 0 THEN
  1205.             BEGIN
  1206.                 NdxSF := '';
  1207.                 wmrm.rX := 30     { null register string }
  1208.             END
  1209.             ELSE NdxSF := '*'+Chr(Ord('0')+wsx.SF);
  1210.                 END;
  1211.  
  1212.         DLoc := FetchDispl(wmrm.D);
  1213.         FormatText(DLoc,wmrm.D,'');
  1214.         FormatDispl(Sx,DLoc,wmrm.D,True);
  1215.         REGSeg   := RegList[wmrm.rS];
  1216.         REGBase  := RegList[wmrm.rB];
  1217.         REGIndex := RegList[wmrm.rX];
  1218.         EAOperand := REGBase;
  1219.         IF Length(REGIndex) > 0
  1220.         THEN EAOperand := EAOperand + '+' + REGIndex + NdxSF;
  1221.         IF wmrm.D > 0 THEN  EAOperand := EAOperand + Sx;
  1222.     END;
  1223.     REGOperand := ExtractReg(AddrMode,W,mrmREG);
  1224. END;
  1225.  
  1226.     { ---------------------------------- }            {.CP08}
  1227.     { Main Driver for 80386 Operand Edit }
  1228.     { ---------------------------------- }
  1229.  
  1230. PROCEDURE Edit386Ops;
  1231. VAR
  1232.     OpEdit        : TagRec;    Sx    : OprStr;
  1233.     i               : Byte;
  1234.  
  1235.     PROCEDURE EditSplRegs(j : Byte); { CRx,DRx,TRx }    {.CP04}
  1236.     BEGIN
  1237.         Opnd[j] := OpEdit.A + 'R' + Chr(Ord('0')+mrmREG);
  1238.     END;
  1239.  
  1240.     PROCEDURE EditDblRegs(j : Byte); { EAX..EDI }        {.CP04}
  1241.     BEGIN
  1242.         Opnd[j] := RegList[16+mrmREG];
  1243.     END;
  1244.  
  1245.     PROCEDURE EditSegRegs(j : Byte); { ES:..GS: }        {.CP04}
  1246.     BEGIN
  1247.         Opnd[j] := RegList[24+mrmREG];
  1248.     END;
  1249.  
  1250.     PROCEDURE EditLiteral(j : Byte); { literal data }    {.CP04}
  1251.     BEGIN
  1252.         Opnd[j] := RegList[OpEdit.V];
  1253.     END;
  1254.  
  1255.     PROCEDURE EditGprRegs(j : Byte); { Gb,Gw,Gd,Gv }    {.CP04}
  1256.     BEGIN
  1257.         Opnd[j] := REGOperand;
  1258.     END;
  1259.  
  1260.     PROCEDURE EditJmpDspl(j : Byte); { Jb, Jv }        {.CP39}
  1261.         TYPE
  1262.           MyWord = RECORD
  1263.         CASE Byte OF
  1264.         0: (Ds : ShortInt);
  1265.         1: (Db : Byte);
  1266.         2: (Dw : Word);
  1267.         3: (Di : Integer);
  1268.         4: (Dd : LongInt);
  1269.         5: (Dv : ARRAY[1..4] OF Byte);
  1270.         END;
  1271.  
  1272.     VAR P : ^MyWord; i,k : Byte; l : LongInt;
  1273.     BEGIN                                   
  1274.             l := CodeBase;
  1275.         IF RegList[OpEdit.V][1] = 'b' THEN
  1276.         BEGIN
  1277.             i := FetchDispl(1);
  1278.                         FormatText(i,1,'');
  1279.             P := @ CodeStack[i];
  1280.             Inc(l,P^.Ds + CodeOfs);
  1281.             P := @l;
  1282.             Opnd[j] := 'SHORT ' + HexB(Hi(P^.Dw))+HexB(Lo(P^.Dw))+'h';
  1283.         END ELSE
  1284.         BEGIN
  1285.             IF ASiz32 THEN k := 4 ELSE k := 2;
  1286.             i := FetchDispl(k);        { Displacement }
  1287.             FormatText(i,k,'');
  1288.                         P := @ CodeStack[i];
  1289.                         Inc(l,CodeOfs);
  1290.                         IF ASiz32
  1291.                THEN Inc(l,P^.Dd)
  1292.                ELSE Inc(l,P^.Di);
  1293.             P := @l;
  1294.             Opnd[j] := 'h';
  1295.             FOR i := 1 TO k DO
  1296.                 Opnd[j] := HexB(P^.Dv[i]) + Opnd[j]
  1297.         END;
  1298.     END;
  1299.  
  1300.     PROCEDURE EditPointer(j : Byte); { Ap }            {.CP13}
  1301.     VAR i,k : Byte;
  1302.     BEGIN
  1303.         IF ASiz32 THEN k := 4 ELSE k := 2;
  1304.         i := FetchDispl(k);            { Displacement }
  1305.         FormatText(i,k,'r');
  1306.         FormatDispl(Sx,i,k,False);
  1307.         k := 2;
  1308.         i := FetchDispl(k);            { Selector }
  1309.         FormatText(i,k,'s');
  1310.         FormatDispl(Opnd[j],i,k,False);
  1311.         Opnd[j] := Opnd[j] + ':' + Sx;
  1312.     END;
  1313.  
  1314.     PROCEDURE EditImmData(j : Byte);  { Ib, Iv, Iw }    {.CP17}
  1315.     VAR i,k : Byte;
  1316.     BEGIN
  1317.         CASE RegList[OpEdit.V][1] OF
  1318.             'b':    k := 1;
  1319.             'w':    k := 2;
  1320.             'v':    IF DSiz32 THEN k := 4 ELSE k := 2;
  1321.             ELSE    k := 0
  1322.         END; {CASE}
  1323.         IF k > 0 THEN
  1324.         BEGIN
  1325.             i := FetchDispl(k);
  1326.             FormatText(i,k,'');
  1327.             FormatDispl(Sx,i,k,Is_SignXtnd);
  1328.             Opnd[j] := Sx;
  1329.         END;
  1330.     END;
  1331.  
  1332.     PROCEDURE EditMemAddr(j : Byte);            {.CP07}
  1333.     BEGIN
  1334.         Opnd[j] := '';
  1335.         IF HaveSegPfx   THEN Opnd[j] := REGSegOvr + ': ';
  1336.         Opnd[j] := '['+ Opnd[j] + EAOperand + ']';
  1337.         HaveMemOprnd := True;
  1338.     END;
  1339.  
  1340.     PROCEDURE EditOfsDspl(j : Byte); { Ob, Ov }        {.CP19}
  1341.     VAR i,k : Byte;
  1342.     BEGIN
  1343.         CASE RegList[OpEdit.V][1] OF
  1344.             'b':    k := 2;
  1345.             'v':    IF ASiz32 THEN k := 4 ELSE k := 2;
  1346.             ELSE    k := 0
  1347.         END; {CASE}
  1348.         IF k > 0 THEN
  1349.         BEGIN
  1350.             i := FetchDispl(k);        { Offset }
  1351.             FormatText(i,k,'');
  1352.             FormatDispl(Sx,i,k,False);
  1353.             IF HaveSegPfx AND (mrmMOD <> 3)
  1354.                 THEN Sx := REGSegOvr + ': ' + Sx;
  1355.             Opnd[j] := '[' + Sx + ']';
  1356.             HaveMemOprnd := True;
  1357.         END;
  1358.     END;
  1359.  
  1360.     PROCEDURE EditEffAddr(j : Byte); { Eb, Ew, Ev, Ep }    {.CP28}
  1361.     BEGIN
  1362.         Sx := '';
  1363.         IF mrmMOD <> 3 THEN
  1364.         IF j = 1 THEN
  1365.         CASE RegList[OpEdit.V][1] OF
  1366.             'b':    Sx := 'BYTE';
  1367.             'w':    Sx := 'WORD';
  1368.             'v':    IF DSiz32
  1369.                 THEN Sx := 'DWORD'
  1370.                 ELSE Sx := 'WORD';
  1371.             'p':    IF ASiz32
  1372.                 THEN Sx := 'FWORD'
  1373.                 ELSE Sx := 'DWORD';
  1374.             'q':    Sx := 'QWORD';
  1375.             't':    Sx := 'TBYTE';
  1376.             'd':    Sx := 'DWORD';
  1377.         END; {CASE}
  1378.         IF Sx <> '' THEN Sx := Sx + ' PTR ';
  1379.         IF HaveSegPfx AND (mrmMOD <> 3)
  1380.             THEN Sx := REGSegOvr + ': ' + Sx;
  1381.         Opnd[j] := Sx + EAOperand;
  1382.         IF mrmMOD <> 3
  1383.         THEN BEGIN
  1384.             Opnd[j] := '[' + Opnd[j] + ']';
  1385.             HaveMemOprnd := True;
  1386.              END;
  1387.     END;
  1388.  
  1389.     PROCEDURE EditVarRegs(j : Byte); { eAX..eDI }        {.CP04}
  1390.     BEGIN
  1391.         Opnd[j] := RegList[OpEdit.V+(Ord(DSiz32) SHL 3)];
  1392.     END;
  1393.  
  1394. BEGIN   {Edit386Ops}                                        {.CP24}
  1395.  
  1396.     FOR i := 1 TO 3 DO BEGIN
  1397.         OpEdit := OpTags[i];
  1398.         Opnd[i] := '';
  1399.                 If Not FetchFailure Then
  1400.         CASE OpEdit.A OF
  1401.             'C',
  1402.             'D',
  1403.             'T':    EditSplRegs(i);
  1404.             'A':    EditPointer(i);
  1405.             'R':    EditDblRegs(i);
  1406.             'S':    EditSegRegs(i);
  1407.             'G':    EditGprRegs(i);
  1408.             'J':    EditJmpDspl(i);
  1409.             'I':    EditImmData(i);
  1410.             'M':    EditMemAddr(i);
  1411.             'O':    EditOfsDspl(i);
  1412.             'E':    EditEffAddr(i);
  1413.             'e':    EditVarRegs(i);
  1414.             'r':    EditLiteral(i);
  1415.         END; {CASE}
  1416.     END;
  1417. END; {Edit386Ops}
  1418.  
  1419. PROCEDURE RemovePrefix;                        {.CP19}
  1420. BEGIN
  1421.     WHILE BytesFetched > SPfx DO UnFetchCodeByte;
  1422.     IF SPfx <> 1 THEN
  1423.     BEGIN
  1424.         UnFetchCodeByte;
  1425.         EmitConstants;
  1426.     END ELSE
  1427.     BEGIN
  1428.         CodeByte := CodeStack[SPfx];
  1429.         CodeText := '';
  1430.         FormatText(SPfx,1,'');
  1431.         ActGroup := ActLvl1[CodeByte];
  1432.         Opnd[1] := '';
  1433.         Opnd[2] := '';
  1434.         Opnd[3] := '';
  1435.         Mnemonic := Mnem386[ActGroup.M];
  1436.     END;
  1437. END;
  1438.  
  1439.     { ---------------------------------- }            {.CP13}
  1440.     { Main Driver for 80386 Instructions }
  1441.     { ---------------------------------- }
  1442.  
  1443. PROCEDURE Handle386Op;
  1444. VAR i : Byte; OGate : Gating;
  1445.  
  1446.     PROCEDURE UpdateTags(n : Byte);
  1447.     VAR i : Byte;
  1448.     BEGIN
  1449.       FOR i := 1 TO 3 DO
  1450.         IF OpType386[n,i].A <> ' ' THEN OpTags[i] := OpType386[n,i];
  1451.     END;
  1452.  
  1453.     PROCEDURE HandleOpMRM;                     {.CP16}
  1454.     BEGIN
  1455.         DataByte := FetchByte;
  1456.         IF NOT FetchFailure THEN
  1457.         BEGIN
  1458.             FormatText(BytesFetched,1,'');
  1459.             UnPackModRM(DataByte);
  1460.             OGate := ByteGate;
  1461.             ByteGate := GateLvl3[ByteGate,mrmREG];
  1462.             IF ByteGate = G_Hit THEN
  1463.             BEGIN
  1464.                 MergeActGrp(ActLvl3[OGate,mrmREG]);
  1465.                 UpdateTags(ActGroup.T);
  1466.             END;
  1467.         END;
  1468.     END; {HandleOpMRM}
  1469.  
  1470.     PROCEDURE HandleOp0Fx;                      {.CP19}
  1471.     VAR RowNdx : Gate_2; ColNdx : $0..$F;
  1472.     BEGIN
  1473.         CodeByte := FetchByte;
  1474.         IF NOT FetchFailure THEN
  1475.         BEGIN
  1476.             FormatText(BytesFetched,1,'');
  1477.             RowNdx := GateLvX2[(CodeByte SHR 4) AND $0F];
  1478.             ColNdx := CodeByte AND $0F;
  1479.             ByteGate := GateLvl2[RowNdx,ColNdx];
  1480.             CASE ByteGate OF
  1481.                G_Hit: BEGIN
  1482.                     MergeActGrp(ActLvl2[RowNdx,ColNdx]);
  1483.                     UpdateTags(ActGroup.T);
  1484.                   END;
  1485.                G_RM6..G_RM8: HandleOpMRM;
  1486.             END; {CASE}
  1487.         END;
  1488.     END; {HandleOp0FX}
  1489.  
  1490.         Procedure HandleOpAAM;                    {.CP08}
  1491.     BEGIN
  1492.         DataByte := FetchByte;
  1493.         IF NOT FetchFailure THEN
  1494.         BEGIN
  1495.             FormatText(BytesFetched,1,'');
  1496.         END;
  1497.     END; {HandleOpAAM}
  1498.  
  1499. BEGIN  {Handle386Op}                        {.CP30}
  1500.     FormatText(BytesFetched,1,'');
  1501.     WITH ActLvl1[CodeByte] DO BEGIN
  1502.         ActGroup.F := F;
  1503.         ActGroup.M := M;
  1504.         ActGroup.T := T;
  1505.         OpTags := OpType386[ActGroup.T];
  1506.     END;
  1507.     Case ByteGate OF
  1508.         G_RM1..G_RM9:    HandleOpMRM;
  1509.         G_0Fx:        HandleOp0Fx;
  1510.                 G_AAM:          HandleOpAAM;
  1511.         G_Hit:;
  1512.     END;
  1513.     IF (ActGroup.F AND $7) > Ord(CpuAuth) THEN ByteGate := G_ooo;
  1514.     IF NOT FetchFailure AND (ByteGate <> G_ooo) THEN
  1515.     BEGIN
  1516.         Is_386Xtnsn := (ActGroup.F AND _386Xtnsn) = _386Xtnsn;
  1517.         Is_32BitMax := (ActGroup.F AND _32BitMax) = _32BitMax;
  1518.         Is_16BitMin := (ActGroup.F AND _16BitMin) = _16BitMin;
  1519.         Is_SignXtnd := (ActGroup.F AND _SignXtnd) = _SignXtnd;
  1520.         Is_MODrmFld := (ActGroup.F AND _MODrmFld) = _MODrmFld;
  1521.         IF Is_MODrmFld AND NOT HaveMRM THEN
  1522.         BEGIN
  1523.             CodeByte := FetchByte;
  1524.             IF NOT FetchFailure THEN UnPackModRM(CodeByte);
  1525.             FormatText(BytesFetched,1,'');
  1526.         END;
  1527.         IF Is_32BitMax OR Is_16BitMin THEN WBitMode := W1;
  1528.     END;
  1529.     IF FetchFailure OR (ByteGate = G_ooo) OR (ActGroup.M = 0)    {.CP32}
  1530.     THEN EmitConstants ELSE
  1531.     BEGIN
  1532.         IF DSiz32 AND Is_386Xtnsn
  1533.             THEN Mnemonic := Mnem386[ActGroup.M+1]
  1534.             ELSE Mnemonic := Mnem386[ActGroup.M];
  1535.         IF HaveMRM THEN DecodeModRM(WBitMode);
  1536.         Edit386Ops;
  1537.                 If NOT FetchFailure
  1538.         Then
  1539.            IF HaveSegPfx AND (NOT HaveMemOprnd)
  1540.            THEN RemovePrefix ELSE
  1541.            BEGIN
  1542.             EmuFlag := 0;
  1543.             IF (BytesFetched = 2) AND (CodeStack[1] = $CD) THEN
  1544.                 CASE CodeStack[2] OF
  1545.                     $34..$3B,
  1546.                     $3E: BEGIN
  1547.                         EmuFlag := CodeStack[2];
  1548.                         Opnd[3] := '; F-P Emulator Linkage';
  1549.                          END;
  1550.                     $3C: BEGIN
  1551.                         EmuFlag := CodeStack[2];
  1552.                         Opnd[3] := '; Emulated SEG Prefix';
  1553.                          END;
  1554.                     $3D: Opnd[3] := '; Emulated FWAIT ';
  1555.                 END;
  1556.            END
  1557.                 Else EmitConstants;
  1558.         { emit instruction }
  1559.     END;
  1560. END; {Handle386Op}
  1561.  
  1562.     { ----------------------------------------- }        {.CP47}
  1563.     { Main driver for Co-Processor Instructions }
  1564.     { ----------------------------------------- }
  1565.  
  1566. PROCEDURE Handle387Op(Emulation : Boolean);
  1567. CONST T : ARRAY[2..10] OF Byte = (41,37,39,39,35,40,35,40,41);
  1568. VAR esc,flaga,flagop :byte; MpuAux : MpuVec;
  1569.     stkr : char;
  1570.  
  1571. BEGIN
  1572.     esc := CodeByte AND $07;
  1573.     IF NOT Emulation THEN FormatText(BytesFetched,1,'');
  1574.     CodeByte := FetchByte;
  1575.     IF NOT FetchFailure THEN UnPackModRM(CodeByte);
  1576.     FormatText(BytesFetched,1,'');
  1577.     IF mrmMOD = 3 THEN
  1578.     BEGIN
  1579.         MpuAux   := MpuM11[esc,mrmREG];    {flags,link}
  1580.         MpuAux.M := MpuOv[MpuAux.M,mrmRM]  { mnemonic }
  1581.     END
  1582.     ELSE
  1583.         MpuAux   := MpuEA[esc,mrmREG];     {flags,mnemonic}
  1584.  
  1585.     flaga  := MpuAux.F SHR 4;
  1586.     IF flaga = 0 THEN EmitConstants ELSE
  1587.     BEGIN
  1588.         flagop := MpuAux.F AND $0F;
  1589.         stkr   := Chr(Ord('0')+mrmRM);
  1590.         CASE flagop OF
  1591.              0:     Opnd[1] := '';
  1592.              1:     Opnd[1] := 'AX';
  1593.              2..10:     BEGIN
  1594.                     DecodeModRM(W0);
  1595.                     OpTags := OpType386[96];
  1596.                     OpTags[1].V := T[flagop];
  1597.                     Edit386Ops;
  1598.                 END;
  1599.             11:     Opnd[1] := 'ST('+stkr+')';
  1600.             12:     Opnd[1] := 'ST('+stkr+'),ST';
  1601.             13:     Opnd[1] := 'ST,ST('+stkr+')';
  1602.         END;
  1603.         Mnemonic := Mnem387[MpuAux.M];
  1604.         Opnd[2] := '';
  1605.         Opnd[3] := '';
  1606.         { Emit Instruction Here }
  1607.     END;
  1608. END; {Handle387Op}
  1609.  
  1610.     { ----------------------------------------- }        {.CP16}
  1611.     { Main Driver for ALL Instruction Sequences }
  1612.     { ----------------------------------------- }
  1613.  
  1614. PROCEDURE HandleInstruction;
  1615. BEGIN
  1616.     ByteGate := GateLvl1[CodeByte];
  1617.     WHILE ByteGate = G_Pfx DO HandlePrefix;
  1618.     IF ASiz32 THEN AddrMode := Adr32 ELSE AddrMode := Adr16;
  1619.     IF NOT FetchFailure    THEN
  1620.         CASE ByteGate OF
  1621.             G_RM1..G_0Fx:    Handle386Op;  {Get Op and modR/M}
  1622.             G_387:         Handle387Op(False); { Ndp Ops   }
  1623.             ELSE        EmitConstants {Invalid Op Codes }
  1624.         END;
  1625. END;
  1626.  
  1627.     { -------------------------------- }            {.CP34}
  1628.     { Initialize for Instruction Fetch }
  1629.     { -------------------------------- }
  1630.  
  1631. PROCEDURE StartOpFetch; { Initializes for next Instruction }
  1632. BEGIN
  1633.     Is_386Xtnsn    := False;    Is_32BitMax    := False;
  1634.     Is_16BitMin    := False;    Is_SignXtnd     := False;
  1635.     Is_MODrmFld     := False;
  1636.     HaveSizePfx    := False;    HaveAddrPfx     := False;
  1637.     HaveMRM         := False;    HaveSIB        := False;
  1638.     FetchFailure    := False;       HaveMemOprnd    := False;
  1639.     HaveInstPfx    := False;    HaveSegPfx    := False;
  1640.     ASiz32        := SegDBit;    DSiz32        := SegDBit;
  1641.  
  1642.     CodeByte    := 0;        OprBytes    := 0;
  1643.     BytesFetched    := 0;        mrmMOD        := 0;
  1644.     mrmREG        := 0;        mrmRM        := 0;
  1645.     sibSS        := 0;        sibNDX        := 0;
  1646.     sibBAS        := 0;        PfxMax          := 0;
  1647.     PrefixBytes    := 0;        DLoc        := 0;
  1648.     SPfx        := 0;
  1649.  
  1650.     CodeText    := '';        NdxSF        := '';
  1651.     EAOperand    := '';        REGSeg        := '';
  1652.     REGBase        := '';        REGIndex    := '';
  1653.     REGOperand    := '';        REGSegOvr    := '';
  1654.  
  1655.     WBitMode    := W0;        AddrMode    := Adr16;
  1656.     ActGroup.F    := 0;        ActGroup.M    := 0;
  1657.     ActGroup.T    := 0;           VirtualIP    := CodeOfs;
  1658.  
  1659.     CodeByte := FetchByte;
  1660. END;
  1661.  
  1662.     { ------------------------------------- }        {.CP16}
  1663.     { Prototype For Disassembly of One Line }
  1664.     { ------------------------------------- }
  1665.  
  1666. PROCEDURE DisassembleLine;
  1667. BEGIN
  1668.     StartOpFetch;
  1669.     CASE EmuFlag OF           {Handle Turbo F-P Emulator Expansions}
  1670.         $34..$3B : BEGIN
  1671.                 UnFetchCodeByte;
  1672.                 CodeByte := EmuFlag + $A4;
  1673.                 Handle387Op(True);
  1674.                 Mnemonic := 'EMU_'+Mnemonic;
  1675.                 EmuFlag := 0;
  1676.                 Opnd[3] := '; Emulated Operation';
  1677.                END;
  1678.         $3C:       BEGIN                    {.CP22}
  1679.                 HaveSegPfx := True;
  1680.                 REGSegOvr := RegList[24+(CodeByte SHR 6 XOR 3)];
  1681.                 Handle387Op(False);
  1682.                 Mnemonic := 'EMU_'+Mnemonic;
  1683.                 EmuFlag := 0;
  1684.                 Opnd[3] := '; Emulated Operation';
  1685.                END;
  1686.         $3E:       BEGIN  { DB xxH for parameters }
  1687.                 EmitConstants;
  1688.                 Opnd[3] := '; Fast Path Emulations ';
  1689.                 EmuFlag := 0;
  1690.                END;
  1691.         ELSE BEGIN
  1692.             HandleInstruction;
  1693.             IF HaveInstPfx
  1694.             THEN
  1695.               Mnemonic := Mnem386[ActLvl1[IPfx].M] + ' '
  1696.                       + Mnemonic;
  1697.              END
  1698.     END; {CASE}
  1699. END;
  1700.  
  1701. PROCEDURE UnAssemble(U : Pointer; VAR P : ObjArg);        {.CP31}
  1702. BEGIN
  1703.     WITH P DO BEGIN
  1704.         IF NOT (TCpu IN [C086..C386]) THEN TCpu := C086;
  1705.         CpuAuth := TCpu;
  1706.         CodeSeg := Seg(U^);
  1707.         CodeOfs := Ofs(U^)+Obj;
  1708.                 CodeBase:= CBase;
  1709.         BytesRemaining := Lim;
  1710.         VirtualIP := Obj;
  1711.         Locn := 0;
  1712.         Code := '';
  1713.         Mnem := '';
  1714.         Opr1 := '';
  1715.         Opr2 := '';
  1716.         Opr3 := '';
  1717.     END;
  1718.     DisAssembleLine;
  1719.     WITH P DO BEGIN
  1720.         Obj  := Obj+BytesFetched;
  1721.         Lim  := BytesRemaining;
  1722.         Code := CodeText;
  1723.         Mnem := Mnemonic;
  1724.         Opr1 := Opnd[1];
  1725.         Opr2 := Opnd[2];
  1726.         Opr3 := Opnd[3];
  1727.         Locn := VirtualIP;
  1728.     END;
  1729. END;
  1730.  
  1731. END.
  1732.